本記事では、 System.Management.Automation.Host.PSHostUserInterface で定義されているユーザの入力を促す Prompt メソッドを使用してみます。参考にPSHostUserInterface のMSDNドキュメントのリンクを以下に掲載します。

MSDNドキュメントのリンク
http://msdn.microsoft.com/en-us/library/system.management.automation.host.pshostuserinterface(VS.85).aspx

具体的に使ってみるメソッドは、 次のメソッドです。

メソッド 説明
Prompt 1以上の入力項目を取得します
PromptForChoice 複数の選択項目から選択された項目を取得します
PromptForCredential ユーザの資格情報の取得します

PromptForCredential メソッドは実際のところGet-Credential コマンドレットと同じです。

1. サンプルプログラム

PSHostUserInterfacePromptTest.ps1 というファイルを作成して、実行してみました。ユーザ資格情報はSecureString 型ですが、サンプルスクリプトではプレーンテキストに戻す方法も紹介しています。

##########################################################
# ファイル名: PSHostUserInterfacePromptTest.ps1
#
# PSHostUserInterface の Prompt メソッドを使ってみる
##########################################################

# System.Management.Automation.Host.PSHostUserInterface.Prompt Method
# 複数の入力を受け取る場合に使用する
$descriptions = New-Object 'System.Collections.ObjectModel.Collection`1[System.Management.Automation.Host.FieldDescription]'
$desc = New-Object System.Management.Automation.Host.FieldDescription "名前"
$descriptions.Add($desc)
$desc = New-Object System.Management.Automation.Host.FieldDescription "連絡先"
$descriptions.Add($desc)
$caption = "連絡先情報入力"
$message = "名前と連絡先を入力して下さい"

$returnValue =  $host.UI.Prompt($caption, $message, $descriptions)
Write-Host "入力された情報"
$returnValue["名前"]
$returnValue["連絡先"]

# System.Management.Automation.Host.PSHostUserInterface.PromptForChoice Method
# 複数の項目から1つの項目を選択する
$caption = "個人設定"
$message = "好きな色を選択して下さい"
$choices =  New-Object 'System.Collections.ObjectModel.Collection`1[System.Management.Automation.Host.ChoiceDescription]'
$choice = New-Object System.Management.Automation.Host.ChoiceDescription "赤(&R)", "血の色ダイスキ"
$choices.Add($choice)
$choice = New-Object System.Management.Automation.Host.ChoiceDescription "青(&B)", "アオミドロダイスキ"
$choices.Add($choice)
$choice = New-Object System.Management.Automation.Host.ChoiceDescription "黄(&Y)", "黄猿"
$choices.Add($choice)
$returnValue =  $host.UI.PromptForChoice($caption, $message, $choices, 1)
Write-Host "PromptForChoice の結果"
Write-Host "選択されたインデックス $returnValue , $($choices[$returnValue].Label)"

# System.Management.Automation.Host.PSHostUserInterface.PromptForCredential Method
# ユーザの資格情報を取得する Get-Credential コマンドレットと同じ
$caption = "ユーザ情報入力"
$prompt =  "ユーザの資格情報を入力してください"
$credential = $host.UI.PromptForCredential($caption, $prompt, "$Env:USERDOMAIN\$Env:UserName", $null)

# $credential.Password は SecureString なのでパスワードテキストを調べることはできない
$credential.Password
# でもみれちゃう
# 方法1
$credential.GetNetworkCredential().Password
# 方法2
[System.Runtime.InteropServices.Marshal]::PtrToStringAuto([Runtime.InteropServices.Marshal]::SecureStringToBSTR($credential.Password))

 実行結果は次のようになります。Prompt メソッドで複数の入力を行い、 PromptForChoice で選択項目から1つ選択します。 PromptForCredential でユーザ情報を入力します。PromptForCredential は Get-Credential コマンドレットで同じことが行えます。

好きな色を選択する処理を行ったと、下図のユーザ情報入力ダイアログが表示されます。

2. まとめ

説明は以上です。 $host.UI のプロパティが実装しているPSHostUserInterface インタフェースには、入出力に関連するさまざまなメソッドが定義されています。今回はPrompt を使用してみました。