我想提示用户进行一系列输入,包括密码和文件名。
我有一个使用host。ui的例子。提示,这似乎是合理的,但我不能理解的回报。
在PowerShell中是否有更好的方法来获取用户输入?
我想提示用户进行一系列输入,包括密码和文件名。
我有一个使用host。ui的例子。提示,这似乎是合理的,但我不能理解的回报。
在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,其中键是提示符中使用的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将为您提供方法的定义。每个定义显示为<返回类型> <方法名称>(<参数>)。
使用参数绑定绝对是这里的方法。它不仅编写起来非常快(只需在强制参数上方添加[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')]),那么它将成为提示的帮助文本。
把它放在脚本的顶部。这将导致脚本提示用户输入密码。然后,生成的密码可以通过$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
)