开关参数会覆盖其他参数

时间:2019-02-27 10:01:46

标签: powershell parameter-passing

在尝试使用powershell进行操作时,我发现了这种交互。当使用具有以下代码的脚本时:

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

然后使用以下命令调用它:

param(
    [switch]$testSwitch = $false,
    [String[]]$names = "ABC","DEF")
echo "names: $names"
echo "test: $testSwitch"

对我来说,期望的回报是名称不变,并且testSwitch返回True-因为这是独立于输入实际值的开关的默认值(至少是我的理解)。 实际的回报是:

.\testScript.ps1 -testSwitch true

testSwitch的值对我来说并不奇怪,但是名称的值被testSwitch中输入的值覆盖。我正在努力理解为什么要这么做。 所以我的问题是,为什么在拥有命名参数的同时,某个参数的值输入会覆盖一个完全不同的参数?

这似乎只发生在switch上,同一示例使用int32而不是switch,并输入1且默认参数为0,将返回预期结果。

1 个答案:

答案 0 :(得分:2)

由于-testSwitch是一个切换参数,如果指定它后没有任何值,则将其设置为true。

因为您使用了字符串true作为尝试为其设置的值,而不是$true,而是将字符串'true'放入了其他参数。

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

.\testScript.ps1 -testSwitch:$true

请注意,这仅对于开关参数值是必需的(但是,如前所述,通常不必指定值,因为仅使用它就可以使它成为真)。