Answers:
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
将为您提供方法的定义。每个定义显示为<Return Type> <Method Name>(<Parameters>)
。
使用参数绑定绝对是解决问题的方法。不仅编写起来非常快(只需[Parameter(Mandatory=$true)]
在必需参数上方添加),它也是以后不会讨厌自己的唯一选择。
以下内容:
[Console]::ReadLine
PowerShell 的FxCop规则明确禁止。为什么?因为它仅适用于PowerShell.exe,不适用于PowerShell ISE,PowerGUI等。
读主机很简单,是一种不好的形式。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