対話的にスクリプトを実行させたいときってありますよね。
その基本となる入力を待ちうけるにはどのように書くかをメモしておきます。もちろん Powershell で です。
書き方
基本からいくつかのパターンを紹介します。
基本的な対話入力
1 2 3 |
$Input = Read-Host "名前を入力してください" $Output = "あなたの名前は " + $Input + " です" Write-Output $Output |
↑の内容で read.ps1 を作成し、実行すると以下のように表示されます。
1 2 |
PS > .\read.ps1 名前を入力してください: |
「名前を入力してください:」の後に「トランプ」と入力してエンターキーを押すと以下となります。
1 2 3 |
PS > .\read.ps1 名前を入力してください: トランプ あなたの名前は トランプ です |
パスワードの入力など
1 2 |
$Input = Read-Host "パスワード を入力してください" -AsSecureString Write-Output $Input |
↑の内容で read_secure.ps1 を作成し、実行すると以下のように表示されます。
1 2 3 |
PS > .\read_secure.ps1 パスワード を入力してください: ******** System.Security.SecureString |
見ての通り入力した文字列は伏字で表示されています。この時入力した文字列は暗号化されているため、このままではこの後の処理で扱うことができません。
そのため、以下のようにして SecureString から平文に変換します。
1 2 3 4 5 6 7 8 |
$Input = Read-Host "パスワード を入力してください" -AsSecureString $bstrInputStr = [System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($Input) $ptrInputStr = [System.Runtime.InteropServices.Marshal]::PtrToStringBSTR($bstrInputStr) $Output = "あなたの入力したパスワードは " + $ptrInputStr + " です。" Write-Output $Output |
↑のスクリプトを実行し、「President!」と入力してエンターキーを押すと以下のように平文で取得できます。
1 2 3 |
PS > .\read_secure_composite.ps1 パスワード を入力してください: ********** あなたの入力したパスワードは President! です。 |
応用編
上の2つの書き方を使ってユーザを作成出来るスクリプトです。応用というよりもそのままくっつけただけ。しかも net user じゃなくて Powershell のコマンドレットでやるべきだよなあ。。。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
# ユーザ名/パスワードを入力 $Name = Read-Host "ユーザ名を入力してください" $InputPassA = Read-Host "パスワードを入力してください" -AsSecureString $InputPassB = Read-Host "再度パスワードを入力してください" -AsSecureString # パスワードを平文で取得 $bstrInPassA = [System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($InputPassA) $PasswordA = [System.Runtime.InteropServices.Marshal]::PtrToStringBSTR($bstrInPassA) $bstrInPassB = [System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($InputPassB) $PasswordB = [System.Runtime.InteropServices.Marshal]::PtrToStringBSTR($bstrInPassB) # 入力されたパスワードをチェック function InputPassCheck { if ( $PasswordA -ne $PasswordB ) { write-host "入力されたパスワードが一致しません。`r`nもう一度やり直してください。" exit 1 } } InputPassCheck # ユーザ追加 net user $Name $Password /add > $null # check $enabled = Get-WmiObject Win32_UserAccount | Select-Object -expand name | Select-String $Name if ( $Name -eq $enabled ) { echo "正常にユーザが作成されました。" }else{ echo "エラー:正常にユーザが作成されたか確認してください。" } |
継続確認
入力させるというよりは、コマンドプロンプトでいう pause のイメージです。
何かしらのキーを押すまで処理を待つ、という動きです。オプション -NoNewLine を指定することで改行する前に入力を待つようになります。ちなみに入力された内容は $null で捨てておきます。
1 2 |
Write-Host "処理を継続する場合は何かキーを押してください..." -NoNewLine [Console]::ReadKey($true) > $null |
以上です。
↓↓↓ Powershell のおすすめレシピ ~結局はオライリー~