使用PowerShell调用(&)运算符使用开关参数调用PowerShell脚本

时间:2016-03-22 20:47:44

标签: powershell

假设我们有以下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",我该怎么办?

3 个答案:

答案 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