我想提示用户输入一系列内容,包括密码和文件名。我有一个使用host.ui.prompt的例子,这似乎是明智的,但我不能理解返回。有没有更好的方法在PowerShell中获取用户输入?
host.ui.prompt
vs3odd8k1#
作为一种替代方法,您可以将其作为脚本参数添加到脚本执行的输入中
param( [Parameter(Mandatory = $True,valueFromPipeline=$true)][String] $value1, [Parameter(Mandatory = $True,valueFromPipeline=$true)][String] $value2 )
字符串
r7xajy2e2#
Read-Host是一个简单的选项,用于从用户处获取字符串输入。
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']的值。“要在不调用方法的情况下访问信息,请不要使用括号:
$host.UI.Prompt()
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>)。
$Host.UI.Prompt.OverloadDefinitions
<Return Type> <Method Name>(<Parameters>)
u5rb5r593#
使用参数绑定绝对是一个不错的选择,它不仅写起来非常快(只需要在你的强制参数上添加[Parameter(Mandatory)]),而且它也是你以后不会讨厌自己的唯一选择。更多信息如下:[Console]::ReadLine被PowerShell的FxCop规则明确禁止。为什么?因为它只在PowerShell.exe中工作,而不是PowerShell ISE,PowerGUI等。很简单,Read-Host是一种糟糕的形式。Read-Host会不受控制地停止脚本以提示用户,这意味着您永远不会有另一个包含使用Read-Host的脚本的脚本。你在问参数。您应该使用[Parameter(Mandatory)]属性和正确的键入来请求参数。如果你在[SecureString]上使用它,它将提示输入密码字段。如果你在凭证类型([Management.Automation.PSCredential])上使用它,如果参数不在那里,凭证对话框将弹出。字符串将变成一个普通的旧文本框。如果你向参数属性(即[Parameter(Mandatory, HelpMessage = 'New User Credentials')])添加一个HelpMessage,它将成为提示的帮助文本。
[Parameter(Mandatory)]
[Console]::ReadLine
[SecureString]
[Management.Automation.PSCredential]
[Parameter(Mandatory, HelpMessage = 'New User Credentials')]
brqmpdu14#
将其放在脚本的顶部。这将导致脚本提示用户输入密码。然后可以通过 $pw 在脚本的其他地方使用生成的密码。
Param( [Parameter(Mandatory=$true, Position=0, HelpMessage="Password?")] [SecureString]$password ) $pw = [Runtime.InteropServices.Marshal]::PtrToStringAuto([Runtime.InteropServices.Marshal]::SecureStringToBSTR($password))
字符串如果您想调试并查看刚刚读取的密码的值,请使用:用途:
write-host $pw
型
4条答案
按热度按时间vs3odd8k1#
作为一种替代方法,您可以将其作为脚本参数添加到脚本执行的输入中
字符串
r7xajy2e2#
Read-Host
是一个简单的选项,用于从用户处获取字符串输入。字符串
要隐藏密码,您可以用途:
型
要将密码转换为纯文本:
型
至于
$host.UI.Prompt()
返回的类型,如果您在@Christian的注解中发布的链接处运行代码,则可以通过将其管道化到Get-Member
来找出返回类型(例如,$results | gm
)。结果是一个Dictionary,其中的键是提示中使用的FieldDescription
对象的名称。要访问链接示例中第一个提示的结果,请键入:$results['String Field']
的值。“要在不调用方法的情况下访问信息,请不要使用括号:
型
$Host.UI.Prompt.OverloadDefinitions
会给予方法的定义。每个定义都会显示为<Return Type> <Method Name>(<Parameters>)
。u5rb5r593#
使用参数绑定绝对是一个不错的选择,它不仅写起来非常快(只需要在你的强制参数上添加
[Parameter(Mandatory)]
),而且它也是你以后不会讨厌自己的唯一选择。更多信息如下:
[Console]::ReadLine
被PowerShell的FxCop规则明确禁止。为什么?因为它只在PowerShell.exe中工作,而不是PowerShell ISE,PowerGUI等。很简单,Read-Host是一种糟糕的形式。Read-Host会不受控制地停止脚本以提示用户,这意味着您永远不会有另一个包含使用Read-Host的脚本的脚本。
你在问参数。
您应该使用
[Parameter(Mandatory)]
属性和正确的键入来请求参数。如果你在
[SecureString]
上使用它,它将提示输入密码字段。如果你在凭证类型([Management.Automation.PSCredential]
)上使用它,如果参数不在那里,凭证对话框将弹出。字符串将变成一个普通的旧文本框。如果你向参数属性(即[Parameter(Mandatory, HelpMessage = 'New User Credentials')]
)添加一个HelpMessage,它将成为提示的帮助文本。brqmpdu14#
将其放在脚本的顶部。这将导致脚本提示用户输入密码。然后可以通过 $pw 在脚本的其他地方使用生成的密码。
字符串
如果您想调试并查看刚刚读取的密码的值,请使用:用途:
型