回答:
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>)
ます。
ここでは、パラメータバインディングを使用するのが確実です。記述するのが非常に速いだけでなく([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')]
)に追加すると、プロンプトのヘルプテキストになります。
Read-Host
「不正な形式」であるという理由は当てはまりません。さらに、いくつかの回答だけに限定されるなど、そうではない.ShouldProcess()
制限がRead-Host
あります。しかし.ShouldProcess()
、それが適用可能な場合は、それがより良いことに同意します。
これをスクリプトの上部に配置します。これにより、スクリプトはユーザーにパスワードを要求します。結果のパスワードは、$ pwを介してスクリプトの他の場所で使用できます。
Param(
[Parameter(Mandatory=$true, Position=0, HelpMessage="Password?")]
[SecureString]$password
)
$pw = [Runtime.InteropServices.Marshal]::PtrToStringAuto([Runtime.InteropServices.Marshal]::SecureStringToBSTR($password))
先ほど読んだパスワードの値をデバッグして確認したい場合は、次を使用します。
write-host $pw