web-dev-qa-db-ja.com

PowerShellでユーザー入力を求める

パスワードとファイル名を含む一連の入力をユーザーに要求します。

Host.ui.Promptを使った例がありますが、これは賢明に思えますが、返ってきたことが理解できません。

PowerShellでユーザー入力を取得するためのより良い方法はありますか?

185
AJ.

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>)として表示されます。

286
Rynant

パラメータバインディングを使用することは間違いなくここに行く方法です。書くのがとても速いだけでなく(必須のパラメータの上に[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')])に追加すると、それがプロンプトのヘルプテキストになります。

72

これをスクリプトの一番上に置きます。スクリプトはユーザーにパスワードの入力を促します。作成されたパスワードはスクリプトの他の場所で $ pw を介して使用できます。

   Param(
     [Parameter(Mandatory=$true, Position=0, HelpMessage="Password?")]
     [SecureString]$password
   )

   $pw = [Runtime.InteropServices.Marshal]::PtrToStringAuto([Runtime.InteropServices.Marshal]::SecureStringToBSTR($password))

あなたがたった今読んだパスワードの値をデバッグして見たい場合は、次のようにしてください。

   write-Host $pw
14
user2334160

代わりに、スクリプト実行の一部として入力用のスクリプトパラメータとして追加することもできます。

 param(
      [Parameter(Mandatory = $True,valueFromPipeline=$true)][String] $value1,
      [Parameter(Mandatory = $True,valueFromPipeline=$true)][String] $value2
      )
3
Maverick