我想提示用户输入一系列输入,包括密码和文件名。
我有一个使用 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
)。结果是一个字典,其中键是提示中使用的 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)]
),而且它也是您以后不会讨厌自己的唯一选择。
更多内容如下:
PowerShell 的 FxCop 规则明确禁止 [Console]::ReadLine
。为什么?因为它只适用于 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
作为替代方案,您可以将其添加为脚本参数以作为脚本执行的一部分进行输入
param(
[Parameter(Mandatory = $True,valueFromPipeline=$true)][String] $value1,
[Parameter(Mandatory = $True,valueFromPipeline=$true)][String] $value2
)