PowerShellは、システム管理や業務自動化において非常に強力なツールですが、スクリプトの実行中にユーザーからの指示やデータを受け取りたい場面が多々あります。
インタラクティブなスクリプトを作成する際に欠かせないのが、ユーザー入力を直接受け取るためのRead-Hostコマンドレットです。
この記事では、Read-Hostの基本的な使い方から、パスワード入力を安全に扱う方法、さらには実用的なバリデーション処理までを詳しく解説します。
2026年現在の最新のPowerShell環境(PowerShell 7.x以降)を前提に、効率的でセキュアなスクリプト開発のテクニックを学んでいきましょう。
Read-Hostの基本機能と使い方
Read-Hostは、ユーザーに対して入力を促すプロンプトを表示し、入力された内容を文字列として取得するためのコマンドレットです。
最もシンプルな使い方は、プロンプトに表示するメッセージを引数として渡す方法です。
# ユーザーに入力を求める基本的な例
$name = Read-Host "あなたの名前を入力してください"
Write-Host "こんにちは、$name さん!"
あなたの名前を入力してください: (ここで入力を待機)
こんにちは、[入力された名前] さん!
上記のコードを実行すると、コンソールには指定した文字列が表示され、ユーザーがEnterキーを押すまでスクリプトの実行が一時停止します。
取得した値は変数に格納して後続の処理で利用することが一般的です。
注意点として、Read-Hostは常にオブジェクトを文字列(String型)として返します。
たとえ数字を入力したとしても、それは数値型ではなく文字列型として扱われるため、計算に使用する場合は型変換が必要になります。
また、プロンプト文字列の末尾には自動的にコロン(:)が付与される仕様となっています。
セキュアな入力:パスワードを安全に受け取る
パスワードやAPIキーなどの機密情報を入力させる場合、入力内容が画面にそのまま表示されるのはセキュリティ上好ましくありません。
Read-Hostには、入力をマスクするための-AsSecureStringスイッチが用意されています。
# パスワードをセキュアに入力させる
$password = Read-Host "パスワードを入力してください" -AsSecureString
パスワードを入力してください: **********
このオプションを使用すると、入力した文字がアスタリスク(*)などで隠され、背後の変数にはSystem.Security.SecureStringオブジェクトとして格納されます。
SecureStringはメモリ上でも暗号化されており、不正なメモリダンプなどから情報を保護する役割を果たします。
ただし、最近のPowerShell(特にクロスプラットフォーム環境)では、このSecureStringの取り扱いが推奨されないケースもあります。
2026年現在のプラクティスでは、可能な限り認証には資格情報(PSCredential)オブジェクトを使用することが推奨されます。
それでも、単純なスクリプトで即座に秘密情報を隠したい場合には、この-AsSecureStringが最も手軽な手段となります。
SecureStringからプレーンテキストへの変換
特定のAPIや古い関数では、暗号化された状態ではなく、通常の文字列としてパスワードを渡さなければならないことがあります。
その場合は、以下の手法でプレーンテキストに戻すことが可能ですが、取り扱いには細心の注意を払ってください。
# SecureStringをプレーンテキストに変換する(注意が必要)
$plainPassword = [System.Runtime.InteropServices.Marshal]::PtrToStringAuto(
[System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($password)
)
この処理を行った瞬間、メモリ上には平文のパスワードが存在することになります。
不要になったらすぐに変数を破棄するか、スコープを最小限に留めるのが鉄則です。
入力データの型変換とバリデーション
Read-Hostで受け取ったデータは文字列であるため、意図しない値が入力されるとスクリプトがエラーで停止する原因になります。
特に数値を扱う場合や、特定の選択肢を選ばせる場合には、適切なバリデーション(妥当性確認)が必要です。
数値への型変換
ユーザーに年齢や個数などの数値を入力させる例を見てみましょう。
# 文字列を数値型(int)にキャストする
$input = Read-Host "数値を入力してください"
if ($input -as [int]) {
$number = [int]$input
$result = $number * 2
Write-Host "入力された数値の2倍は $result です。"
} else {
Write-Host "有効な数値が入力されませんでした。" -ForegroundColor Red
}
ここで使用している-as演算子は、変換が可能であればその値を返し、不可能であれば$nullを返します。
いきなりキャストするのではなく、変換可能かチェックすることで予期せぬエラーを防ぐことができます。
Whileループを利用した再入力の催促
正しい値が入力されるまで、繰り返し入力を求める構成は非常に実用的です。
# 正しい入力が得られるまで繰り返す
$age = $null
while ($null -eq $age) {
$tempInput = Read-Host "年齢を1から120の間で入力してください"
if ($tempInput -match '^\d+$') {
$val = [int]$tempInput
if ($val -ge 1 -and $val -le 120) {
$age = $val
}
}
if ($null -eq $age) {
Write-Host "エラー:無効な値です。再入力してください。" -ForegroundColor Yellow
}
}
Write-Host "あなたの年齢は $age 歳ですね。"
このロジックでは、正規表現(^\d+$)を用いて数字のみであることを確認し、さらに範囲チェックを行っています。
実践的な利用シーンとTips
Read-Hostは単純なツールですが、工夫次第でスクリプトの利便性を大きく向上させることができます。
デフォルト値の設定
ユーザーが何も入力せずにEnterキーを押した場合に、既定値を採用するテクニックです。
# 未入力の場合にデフォルト値を代入
$server = Read-Host "接続先サーバー名を入力してください [既定: localhost]"
if ([string]::IsNullOrWhiteSpace($server)) {
$server = "localhost"
}
Write-Host "$server に接続します。"
ユーザーの手間を減らすことができるため、頻繁に実行する管理スクリプトで重宝されます。
Read-Hostと引数(Parameter)の使い分け
スクリプトを作成する際、常にRead-Hostを使えば良いわけではありません。
以下の表で、Read-Hostとパラメーター(引数)の使い分けを整理しました。
| 手法 | メリット | デメリット | 最適なシーン |
|---|---|---|---|
| Read-Host | 対話的で直感的。実行中に判断を仰げる。 | 自動化(非対話実行)が困難になる。 | 一回限りの操作や、初心者が使うツール。 |
| Paramブロック | CI/CDやスケジュール実行に対応可能。 | 実行前に引数を指定する手間がある。 | 恒常的な業務自動化、サーバーサイドスクリプト。 |
基本的にはパラメーターを優先し、ユーザーとの対話が必要な補足的な場面でRead-Hostを使うのがベストプラクティスです。
複数行の入力を処理する
Read-Hostは一行の入力しか受け取れませんが、特定のキーワード(例:"END")が入力されるまでループさせることで、複数行のデータを収集できます。
# 複数行の入力をリストとして取得
Write-Host "リストを入力してください('END'で終了):"
$list = New-Object System.Collections.Generic.List[string]
while ($true) {
$line = Read-Host
if ($line -eq "END") { break }
$list.Add($line)
}
Write-Host "合計 $($list.Count) 件のデータを受け取りました。"
トラブルシューティングと注意点
Read-Hostを使用する上で、初心者が陥りやすい落とし穴がいくつかあります。
1. パイプラインとの併用不可
Read-Hostは標準入力(stdin)からデータを受け取る設計ではありません。
そのため、他のコマンドの結果をパイプでRead-Hostに渡すことはできません。
パイプラインからのデータを受け取りたい場合は、$input変数やprocessブロックを使用してください。
2. 非対話型セッションでの停止
タスクスケジューラやAzure Automation、GitHub Actionsなどでスクリプトを動かす場合、Read-Hostが含まれていると、そこで入力待ちが発生し、処理が永久に止まってしまう(ハングアップする)危険があります。
自動実行されることが想定されるスクリプトでは、Read-Hostを絶対に使用しないでください。
環境変数や設定ファイルから値を読み込むように設計を変更しましょう。
3. PowerShell ISEとVS Codeの違い
以前のISE環境ではRead-Hostを実行するとダイアログボックスが表示されることがありましたが、現在のVisual Studio Codeや通常のターミナルでは、コンソール内での直接入力が基本です。
実行環境によって微妙に挙動や見た目が異なる場合があることは覚えておきましょう。
まとめ
Read-Hostは、PowerShellスクリプトにインタラクティブな要素を追加するための最も基本的なコマンドレットです。
文字列としての単純な取得だけでなく、-AsSecureStringを活用したセキュリティ対策や、ループ構造を用いた堅牢なバリデーションの実装など、その活用範囲は多岐にわたります。
しかし、便利な反面、自動化の妨げになるという側面も持っているため、利用シーンを正しく見極めることが重要です。
ユーザーにとって使いやすく、かつエラーに強いスクリプトを書くために、今回解説した型変換やデフォルト値の設定といったテクニックをぜひ活用してください。
適切なユーザーインターフェースを構築することで、あなたのPowerShellスクリプトはよりプロフェッショナルなツールへと進化するはずです。
