Powershell 开关参数覆盖其他参数

Powershell 开关参数覆盖其他参数,powershell,parameter-passing,Powershell,Parameter Passing,在尝试使用powershell时,我发现了这种交互。当脚本包含以下代码时: param( [switch]$testSwitch = $false, [String[]]$names = "ABC","DEF") echo "names: $names" echo "test: $testSwitch" 然后使用以下命令调用它: .\testScript.ps1 -testSwitch true 对我来说,预期的结果是名称不变,testSwitch返回True——因为这是开关

在尝试使用powershell时,我发现了这种交互。当脚本包含以下代码时:

param(
    [switch]$testSwitch = $false,
    [String[]]$names = "ABC","DEF")
echo "names: $names"
echo "test: $testSwitch"
然后使用以下命令调用它:

.\testScript.ps1 -testSwitch true
对我来说,预期的结果是名称不变,testSwitch返回True——因为这是开关的默认值,与输入的实际内容无关(至少我的理解是)。 实际回报为:

names: true
test: True
testSwitch的值对我来说并不奇怪,但是名称的值被testSwitch中输入的值覆盖了。我很难理解为什么会这样。 所以我的问题是,为什么在有命名参数的情况下,为某个参数输入的值会覆盖一个完全不同的参数


这似乎只发生在开关上,同样的例子是int32而不是开关,输入1时默认参数为0,返回预期结果。

因为
-testSwitch
是开关参数,如果指定后没有任何值,则将其设置为true

因为您使用了字符串
true
作为您试图为其设置的值,而不是
$true
,它将字符串“true”放入其他参数中

此外,要向开关参数发送特定值,请在
之后指定它。这将满足您的期望:

.\testScript.ps1 -testSwitch:$true
请注意,这仅对开关参数值是必需的(但如前所述,通常不必指定值,因为仅使用它就是在实现它)