パスワードとファイル名を含む一連の入力をユーザーに要求します。
Host.ui.Prompt
を使った例がありますが、これは賢明に思えますが、返ってきたことが理解できません。
PowerShellでユーザー入力を取得するためのより良い方法はありますか?
Read-Host
は、ユーザーから文字列を入力するための簡単なオプションです。
$name = Read-Host 'What is your username?'
パスワードを隠すには、次のようにします。
$pass = Read-Host 'What is your password?' -AsSecureString
パスワードをプレーンテキストに変換するには
[Runtime.InteropServices.Marshal]::PtrToStringAuto(
[Runtime.InteropServices.Marshal]::SecureStringToBSTR($pass))
$Host.UI.Prompt()
によって返される型については、@ Christianのコメントに掲載されているリンクでコードを実行すると、戻り値の型を Get-Member
にパイプライン接続することで見つけることができます(たとえば、$results | gm
)。結果はDictionaryで、そのキーはPromptで使用されているFieldDescription
オブジェクトの名前です。リンクされた例の最初のプロンプトの結果にアクセスするには、$results['String Field']
と入力します。
メソッドを呼び出さずに情報にアクセスするには、括弧をオフのままにします。
PS> $Host.UI.Prompt
MemberType : Method
OverloadDefinitions : {System.Collections.Generic.Dictionary[string,psobject] Pr
ompt(string caption, string message, System.Collections.Ob
jectModel.Collection[System.Management.Automation.Host.Fie
ldDescription] descriptions)}
TypeNameOfValue : System.Management.Automation.PSMethod
Value : System.Collections.Generic.Dictionary[string,psobject] Pro
mpt(string caption, string message, System.Collections.Obj
ectModel.Collection[System.Management.Automation.Host.Fiel
dDescription] descriptions)
Name : Prompt
IsInstance : True
$Host.UI.Prompt.OverloadDefinitions
はあなたにメソッドの定義を与えるでしょう。各定義は<Return Type> <Method Name>(<Parameters>)
として表示されます。
パラメータバインディングを使用することは間違いなくここに行く方法です。書くのがとても速いだけでなく(必須のパラメータの上に[Parameter(Mandatory=$true)]
を追加するだけでなく)、それはあなたが後で自分を憎むことのない唯一のオプションです。
もっと詳しく
[Console]::ReadLine
はPowerShellの FxCop 規則によって明示的に禁止されています。どうして? PowerShell.exeでのみ機能し、PowerShell _ ise _ 、 PowerGUI などでは機能しないためです。
Read-Host は、ごく単純なことですが、悪い形式です。 Read-Hostは、ユーザーに確認を求めるためにスクリプトを制御不能に停止します。つまり、Read-Hostを使用するスクリプトを含む別のスクリプトを作成することはできません。
あなたはパラメータを要求しようとしています。
パラメータを要求するには、[Parameter(Mandatory=$true)]
属性を使用し、正しい型付けをする必要があります。
これを[SecureString]
で使用すると、パスワードフィールドの入力を求められます。認証情報タイプ([Management.Automation.PSCredential]
)でこれを使用すると、パラメータがない場合は認証情報ダイアログが表示されます。文字列は単なる古いテキストボックスになります。 HelpMessageをパラメータ属性(つまり[Parameter(Mandatory = $true, HelpMessage = 'New User Credentials')]
)に追加すると、それがプロンプトのヘルプテキストになります。
これをスクリプトの一番上に置きます。スクリプトはユーザーにパスワードの入力を促します。作成されたパスワードはスクリプトの他の場所で $ pw を介して使用できます。
Param(
[Parameter(Mandatory=$true, Position=0, HelpMessage="Password?")]
[SecureString]$password
)
$pw = [Runtime.InteropServices.Marshal]::PtrToStringAuto([Runtime.InteropServices.Marshal]::SecureStringToBSTR($password))
あなたがたった今読んだパスワードの値をデバッグして見たい場合は、次のようにしてください。
write-Host $pw
代わりに、スクリプト実行の一部として入力用のスクリプトパラメータとして追加することもできます。
param(
[Parameter(Mandatory = $True,valueFromPipeline=$true)][String] $value1,
[Parameter(Mandatory = $True,valueFromPipeline=$true)][String] $value2
)