在PowerShell中提示用户输入

时间:2011-11-18 14:41:54

标签: powershell

我想提示用户输入一系列输入,包括密码和文件名。

我有一个使用host.ui.prompt的例子,这似乎是明智的,但我无法理解回报。

有没有更好的方法在PowerShell中获取用户输入?

4 个答案:

答案 0 :(得分:286)

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找出返回类型(例如,{ {1}})。结果是一个Dictionary,其中键是提示中使用的$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

答案 1 :(得分:72)

使用参数绑定绝对是这里的方法。它不仅写得非常快(只需将[Parameter(Mandatory=$true)]添加到强制参数之上),而且它也是您以后不会讨厌自己的唯一选择。

更多信息如下:

PowerShell的FxCop规则明确禁止

[Console]::ReadLine。为什么?因为它只适用于PowerShell.exe,而不适用于PowerShell ISEPowerGUI等。

Read-Host很简单,形式不好。 Read-Host无法控制地停止脚本以提示用户,这意味着您永远不会有另一个脚本包含使用Read-Host的脚本。

您正在尝试询问参数。

您应该使用[Parameter(Mandatory=$true)]属性并更正输入,以询问参数。

如果您在[SecureString]上使用此功能,则会提示输入密码字段。如果在Credential类型([Management.Automation.PSCredential])上使用此选项,则会弹出凭据对话框(如果参数不存在)。字符串将成为一个普通的旧文本框。如果您将HelpMessage添加到参数属性(即[Parameter(Mandatory = $true, HelpMessage = 'New User Credentials')]),那么它将成为提示的帮助文本。

答案 2 :(得分:14)

将其放在脚本的顶部。它将导致脚本提示用户输入密码。然后,可以通过 $ pw 在脚本的其他位置使用生成的密码。

   Param(
     [Parameter(Mandatory=$true, Position=0, HelpMessage="Password?")]
     [SecureString]$password
   )

   $pw = [Runtime.InteropServices.Marshal]::PtrToStringAuto([Runtime.InteropServices.Marshal]::SecureStringToBSTR($password))

如果您想调试并查看刚刚阅读的密码值,请使用:

   write-host $pw

答案 3 :(得分:3)

作为替代方案,您可以将其添加为脚本参数,以作为脚本执行的一部分进行输入

 param(
      [Parameter(Mandatory = $True,valueFromPipeline=$true)][String] $value1,
      [Parameter(Mandatory = $True,valueFromPipeline=$true)][String] $value2
      )