powershell - 在 命令行 中,如何在调用Powershell时将变量传递给 switch 参数?

  显示原文与译文双语对照的内容

通常,如果要将 switch 参数的规范推迟到某些变量,可以将表达式传递给 switch 参数,如WhatIf参数所示。


test.ps1

param ( [string] $source, [string] $dest, [switch] $test )
Copy-Item -Path $source -Destination $dest -WhatIf:$test

这使你在使用开关时具有很大的灵活性。 但是,当你使用 cmd.exe 或者其他方法调用powershell时,你会遇到类似如下的内容:


D:test>powershell -file test.ps1 -source test.ps1 -dest test.copy.ps1 -test:$true

D:testtest.ps1 : Cannot process argument transformation on
parameter 'test'. Cannot convert value"System.String" to type"System.Manageme
nt.Automation.SwitchParameter", parameters of this type only accept booleans or
 numbers, use $true, $false, 1 or 0 instead.
At line:0 char:1
+ <<<<
 + CategoryInfo : InvalidData: (:) [test.ps1], ParentContainsError
 RecordException
 + FullyQualifiedErrorId : ParameterArgumentTransformationError,test.ps1

但是,在传递 -test:true 时出现相同的结果,而 -test:1 。 为什么不工作不应该将powershell转换系统自动识别这些字符串为可以转换为布尔值或者 switch,并转换它们?

这意味着在调用其他系统( 例如构建系统) 中的powershell脚本时,必须构造复杂的流控制结构来确定是否在命令字符串中包含 switch,或者省略它。 这看起来很乏味而且容易出错,这让我相信这不是事实。

时间: 原作者:

这里行为已经作为连接的Bug 进行了归档。 这是一个解决方法:


powershell./test.ps1 -source test.ps1 -dest test.copy.ps1 -test:$true

原作者:

使用 switch的IsPresent属性。 例如:


function test-switch{
param([switch]$test)
 function inner{
 param([switch]$inner_test)
 write-host $inner_test
 }
 inner -inner_test:$test.IsPresent
}
test-switch -test:$true
test-switch -test
test-switch -test:$false

True
True
False

顺便说一下,我使用函数而不是脚本,这样测试更容易。

原作者:
...