使用PowerShell调用(&;)操作符调用带有开关参数的PowerShell脚本

使用PowerShell调用(&;)操作符调用带有开关参数的PowerShell脚本,powershell,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,

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

您看到的行为正是我所期望的


如果您想以编程方式构建它,请使用。

如果我偏离了基准,请原谅,但是如果您想有条件地设置该标志,请删除call操作符,只使用splatting

PS M:\Scripts> $params = @{Flag=$true;Str="Bagels"}

PS M:\Scripts> .\switchTest.ps1 @params
Flag: True
Str: Bagels

您提出了一个非常好的问题,并设置了一个非常好的测试用例。让我们将flag保留为不带参数的状态,使其默认为$Null。当您自行指定
-Flag
时,PowerShell将使用开关参数。但是,PowerShell将
“-Flag”
解释为字符串,因此尝试查找与字符串变量匹配的参数,并将该字符串(包括
-
,因为它位于双引号中)传递给与
[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"
执行与上面相同的操作:

 & ".\SwitchTest.ps1" "-Flag"
但是,现在您已经了解了PowerShell如何分配传入的参数,请尝试以下操作来触发
标志
参数,就像您最初打算做的那样:

& .\ParamScript.ps1 "-Flag" -Flag

我知道
iex
有效,我在问为什么
&
无效,以及是否有任何解决方法。字符串始终是字符串。。。。。。如果您想执行存储在字符串中的命令,请按照@briantist的建议使用
iex
。看看这篇文章是否有助于澄清这一点:。我觉得文档中的这句话是您不想在这里使用的:因为调用操作符不解析命令,它无法解释命令参数。我倾向于支持布里安提斯。这不是它的目的。为什么在调用脚本(测试以防万一)时可以省略调用运算符时使用调用运算符呢?不过,如果它是一个scriptblock呢。那你不需要叫接线员吗?我现在明白我的错误了。我试图使用纯字符串调用PS构造(我错误地假设所有参数都归结为字符串)。我需要一个PS构造的PS机制(在本例中是splatting)。漂亮的是,splatting甚至可以与call操作符一起工作(我喜欢保留它,以便无论调用PS脚本还是“普通”exe,我都有一致的代码)。