假设我们有以下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"
,我该怎么办?
答案 0 :(得分:4)
您提出了一个非常好的问题,并设置了一个非常好的测试用例。让我们留下没有参数的标志,因此它默认为$ Null。当您单独指定-Flag
时,PowerShell使用switch paramater。但是,PowerShell将"-Flag"
解释为字符串,因此尝试查找与字符串变量匹配的参数,并将该字符串(包括-
,因为它是双引号)传递给匹配{{{ 1}}类型。最后,由于您向字符串变量发送了字符串[String]
,因此"-Flag"
变量保留为其默认值Flag
或$Null
。好问题。
您可以使用以下代码对其进行测试。
$False
就像你上面那样执行:
#Put this in a script file, e.g. ParamTest.ps1
Flag: False
Str: -Flag
param(
[switch]$Flag,
[string]$Str = $null
)
Write-Output "Flag: $Flag"
Write-Output "Str: $Str"
但是现在您已经看到PowerShell如何分配传入的参数,请尝试以下操作来触发您最初打算执行的 & ".\SwitchTest.ps1" "-Flag"
参数:
Flag
答案 1 :(得分:3)
如果我偏离基础,请原谅我,但如果您想有条件地设置该标志,请删除呼叫操作员并使用splatting。
PS M:\Scripts> $params = @{Flag=$true;Str="Bagels"}
PS M:\Scripts> .\switchTest.ps1 @params
Flag: True
Str: Bagels
答案 2 :(得分:1)
您所看到的行为正是我所期待的。
如果您想以编程方式构建它,请使用Invoke-Expression
。