【发布时间】:2016-03-23 09:36:25
【问题描述】:
假设我们有以下SwitchTest.ps 脚本
param(
[switch]$Flag = $false
)
echo "Flag: $Flag"
以下按预期工作:
& ".\SwitchTest.ps1" -Flag
Flag: True
但事实并非如此
& ".\SwitchTest.ps1" "-Flag"
Flag: False
此外,如果我们将SwitchTest.ps 修改为如下所示:
param(
[switch]$Flag = $false,
[string]$Str = $null
)
echo "Flag: $Flag"
echo "Str: $Str"
我们得到了这个预期的行为:
& ".\SwitchTest.ps1" -Flag
Flag: True
Str:
还有这个意想不到的:
& ".\SwitchTest.ps1" "-Flag"
Flag: False
Str: -Flag
我试过-Flag true、-Flag $true、-Flag:$true...没有雪茄。看起来开关参数在引用时被“跳过”(即当它是正确的字符串时) - 为什么?如果我想以编程方式构建"-Flag",该怎么办?
【问题讨论】:
-
字符串永远是字符串......如果要执行存储在字符串中的命令,请按照@briantist 的建议使用
iex。 -
看看这篇文章是否有助于清除它:Running Executables in PowerShell.
-
我觉得文档中的这句话是你不想在这里的:因为调用运算符不解析命令,它无法解释命令参数。我我倾向于站在布赖恩蒂斯特一边。这不是它的用途。为什么在调用脚本时可以省略调用运算符(测试以防万一)?
-
如果它是一个脚本块呢?那你不需要使用呼叫接线员吗?
-
我现在明白我的错误了。我试图使用纯字符串调用 PS 构造(我错误地认为所有参数都归结为字符串)。我需要一个用于 PS 构造的 PS 机制(在本例中为 splatting)。
标签: powershell