PowerShellでユーザー入力を要求する


209

パスワードとファイル名を含む一連の入力をユーザーに求めたいのですが。

私はの使用例を持っていますがhost.ui.prompt、これは理にかなっているようですが、戻りがわかりません。

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

回答:


333

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)。結果は、キーが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>)ます。


ありがとう、@ Rynant。私の主な質問に実際に答えた唯一の人であると認められた答え!;)他のすべての情報も非常に役立ちます。特に、私はまだPSで自分の道を模索しているためです。
AJ。

問題ありません、@ AJ。メソッドに関する情報を取得する別の方法は、括弧を省略することです。答えに例を追加します。
Rynant、2011年

3
なお、ユーザー名とパスワードを取得している場合は、Get-Credentialを使用することもできます。
Matt Lyons

75

ここでは、パラメータバインディングを使用するのが確実です。記述するのが非常に速いだけでなく([Parameter(Mandatory=$true)]必須パラメーターの上に追加するだけ)、それは後で嫌がらない唯一のオプションでもあります。

以下の詳細:

[Console]::ReadLinePowerShell のFxCopルールによって明示的に禁止されています。どうして?PowerShell.exeでのみ機能し、PowerShell ISEPowerGUIなどでは機能しないためです。

Read-Hostは、非常に単純に悪い形式です。Read-Hostは制御不能にスクリプトを停止してユーザーにプロンプ​​トを表示します。つまり、Read-Hostを使用するスクリプトを含む別のスクリプトを作成することはできません。

パラメータを要求しようとしています。

[Parameter(Mandatory=$true)]パラメータを要求するには、属性を使用し、入力を修正する必要があります。

これをで使用する[SecureString]と、パスワードフィールドの入力を求められます。これを資格情報タイプ([Management.Automation.PSCredential])で使用すると、パラメーターがない場合、資格情報ダイアログがポップアップ表示されます。文字列は単純な古いテキストボックスになります。HelpMessageをパラメーター属性(つまり[Parameter(Mandatory = $true, HelpMessage = 'New User Credentials')])に追加すると、プロンプトのヘルプテキストになります。


5
これは最も柔軟でユーザーフレンドリーなソリューションですが、Rynantの回答のような明確なコード例がなかったため、アドバイスをほとんど無視しました。うまくフォーマットされた例をいくつか提供できますか?
Iain Samuel McLean Elder

4
「Read-Hostは、非常に単純に、不正な形式です」...誰かがANYパラメーターを使用してスクリプトを呼び出さなかったために除外された入力を条件付きで受け入れるためにそれを使用している場合を除きます。ブーム。

2
いいえ:それはまだ悪い形です。そのため、パラメーターを必須としてマークします。
自動化を開始

2
インタラクティブなスクリプトを作成する場合はどうでしょか?特定の条件が満たされた場合にのみユーザー入力を必要とするスクリプトであるとしましょう。たとえば、スクリプトでSDKのターゲットディレクトリを設定する場合、ディレクトリがすでに存在する場合、ユーザーがそのディレクトリを削除することを確認する必要があります。
Jason Goemaat 2015年

6
user1499731は良い点だったと思います。ユーザーからの入力を必要とする場合があるのは情報が表示されるか、別の操作が実行された後にのみ意味のある情報を提供できる場合です。その場合、パラメーターを使用することはできず、ここでRead-Host「不正な形式」であるという理由は当てはまりません。さらに、いくつかの回答だけに限定されるなど、そうではない.ShouldProcess()制限がRead-Hostあります。しかし.ShouldProcess()、それが適用可能な場合は、それがより良いことに同意します。
LarsH 2016

14

これをスクリプトの上部に配置します。これにより、スクリプトはユーザーにパスワードを要求します。結果のパスワードは、$ pwを介してスクリプトの他の場所で使用できます。

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

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

先ほど読んだパスワードの値をデバッグして確認したい場合は、次を使用します。

   write-host $pw

3

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

 param(
      [Parameter(Mandatory = $True,valueFromPipeline=$true)][String] $value1,
      [Parameter(Mandatory = $True,valueFromPipeline=$true)][String] $value2
      )
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.