【问题标题】:How do I pass a string as a non-string to a command in powershell?如何将字符串作为非字符串传递给powershell中的命令?
【发布时间】:2023-03-30 14:58:01
【问题描述】:

我正在尝试有条件地将参数添加到我在powershell 中调用的命令。但是,当我尝试时,我的参数作为字符串传递。我不知道如何将它作为标识符传递。

这是我目前的尝试:

$readParams = $(if ("2".Equals("2")) {"-AsSecureString"})
read-host 'Prompt' $readParams

我得到的输出是:

Prompt -AsSecureString:

我希望能够根据条件不同地设置$readParams。如果条件为真,则获得此行为:

read-host 'Prompt' -AsSecureString

如果条件为假,则获得此行为:

read-host 'Prompt'

我只想在我的程序中写一次read-host

如何动态指定参数而不将其作为字符串传递,从而使其成为提示的一部分,而不是作为标识符样式参数传递?

【问题讨论】:

标签: powershell


【解决方案1】:

您正在寻找的功能称为splatting。它允许您将哈希表呈现给命令并将其解释为参数。

$readParams=@{}
if("2".Equals("2")) {
  $readParams["AsSecureString"]=$true
}
read-host 'Prompt' @readParams

【讨论】:

  • 更简单的$readParams=@{AsSecureString=("2".Equals("2"));Prompt='Prompt'}$input = Read-Host @readParams (+1)
  • 这很公平。无论哪种方式,喷溅都是要走的路。 :-)
  • @LotPings 停止使用$input 作为变量名。它是一个自动变量,应被视为只读。
  • @TheIncorrigible1 感谢您的提醒 ;-) 其中一些 Get-Help about_Automatic_Variables 太诱人了。
【解决方案2】:

如果您想提前准备多个参数,请使用Mike Shepard's helpful answer中描述的喷溅技术,该技术使用一个哈希表,其键以目标cmdlet的参数命名并且还可以与 switch 参数一起使用(作为有条件地忽略以 switch 参数命名的条目的替代方法,无条件地包含它并分配 $True 以模拟 传递 开关,以及$False 模拟省略[1])。


扩展Jacob Colvin's helpful answer

对于 switch 参数,例如 -AsSecureString(一个没有参数的可选布尔参数),挑战在于 switch 的值通常由其 隐含存在 ($True) 与它的缺席 ($False)[2]

然而,一种语法允许显式传递值,即:<expr> 直接附加到开关名称,其中<expr> 是一个表达式,其值被转换为布尔值;用自动的$True$False 变量来说明:

  • -AsSecureString:$True ... 与 -AsSecureString 相同
  • -AsSecureString:$False ... 通常等同于不通过 -AsSecureString[1]

因此,您可以如下解决您的问题,使用表达式(包含在(...)直接,无需辅助。变量$readParams:

 Read-Host 'Prompt' -AsSecureString:('2' -eq '2')

* 显然,表达式值在实际使用中不应该是不变
* '2' -eq '2' 是 PowerShell 的 "2".Equals("2") 等价物,但请注意 PowerShell 的 -eq 默认情况下是不区分大小写的,所以严格来说,-ceq 将是更接近的类比。


[1] 有时,-SomeSwitch:$False 与完全省略开关具有不同的语义,特别是在临时覆盖首选项变量时。例如,如果$VerbosePreference = 'Continue' 的作用是让所有 cmdlet 默认产生详细输出,则可以在单个命令上使用-Verbose:$False 来抑制它。

[2] 严格来说,cmdlet/高级函数中表示开关参数的参数变量的类型为[switch](System.Management.Automation.SwitchParameter );然而,这种类型的实例实际上表现得像布尔值。
有点令人困惑,并且与文档所说的相反,类型的 .IsPresent 属性反映了开关的有效布尔值(松散地说是打开或关闭),不是是否该开关由用户显式传递

【讨论】:

  • 即使使用喷溅(@MikeShepard 的回答),我必须知道可选开关实际上是布尔参数。这是一个全面而有用的答案。就我而言,显式 switch 语法最有意义。
  • 很高兴听到这个消息,@binki。关于开关参数是否为布尔值,我说得有点松散,但实际上你可以这样对待它们;详情请见脚注[2]。
【解决方案3】:

您可以根据条件将开关设置为真或假:

$readParams = $(if ("2".Equals("2")) {$true} else {$false})
read-host 'Prompt' -AsSecureString:$readParams

【讨论】:

    猜你喜欢
    • 2022-12-20
    • 1970-01-01
    • 2014-01-01
    • 2014-07-04
    • 1970-01-01
    • 2018-08-16
    • 2016-09-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多