为什么"switch"类型参数的值传递给字符串参数?

Jim*_*Jim 5 powershell parameter-passing

测试代码(test.ps1):

Param(
    [string]$content = $null,
    [switch]$flag = $false
)
Write-Host $content
Run Code Online (Sandbox Code Playgroud)

输出:

PS C:\Users\powershell> .\test.ps1

PS C:\Users\powershell> .\test.ps1 -flag $true    
True
PS C:\Users\powershell> .\test.ps1 -flag $false
False
PS C:\Users\powershell> .\test.ps1 -flag $true -content "lalala"
lalala

无论我设置$content$null,或者""没有任何默认值,输出都是相同的.

那么为什么$content要从中获取价值$flag呢?

Ans*_*ers 10

@PetSerAl已经表明了你的误解,但也许它有点过于简短,所以我会详细说明一下.

一个[switch]参数不采取像普通的参数值.通常通过提供或省略参数将它们分别设置为true或false:

PS C:\> Get-Content .\test.ps1
Param(
    [string]$Content = $null,
    [switch]$Flag
)
$flag.IsPresent
$Content
PS C:\> .\test.ps1
False

PS C:\> .\test.ps1 -Flag
True

或者,您可以通过在switch参数和值之间放置冒号来显式传递值:

PS C:\> .\test.ps1 -Flag:$false
False

PS C:\> .\test.ps1 -Flag:$true
True

允许冒号之后的空格,但不允许之前的空格(作为切换值-Flag: $false传递$false,-Flag :$false不是).

如果您尝试在没有冒号的情况下分配开关值,则实际将值传递给行中的下一个参数,在您的情况下,-Content参数为:

PS C:\> .\test.ps1 -Flag $false
True         # value of the parameter $Flag
False        # value of the (positional) parameter $Content
PS C:\> .\test.ps1 -Flag -Content $false
True         # value of the parameter $Flag
False        # value of the (named) parameter $Content

如果使用-Flag $true(不带冒号)并将值传递给(named)参数,则-Content该值$true将作为未命名的第三个参数(可通过自动变量 访问)传递$args,就像将值放在语句末尾一样:

PS C:\> Get-Content .\test2.ps1
Param(
    [string]$Content = $null,
    [switch]$Flag
)
$flag.IsPresent
$Content
$args[0]
PS C:\> .\test2.ps1 -Flag $false -Content 'something'
True
something
False        # $false passed as unnamed 3rd parameter
PS C:\> .\test2.ps1 -Flag:$false -Content 'something'
False        # $false passed as explicit value of switch parameter $Flag
something
PS C:\> .\test2.ps1 -Flag -Content 'something' $false
True
something
False        # $false passed as unnamed 3rd parameter