这个问题是关于传递开关参数。我们来看看代码。我有这个PowerShell 3.0功能:
#test1.ps1
param(
[switch] $param1 = $false
)
Write-Host "param1: $($param1.IsPresent)"
Write-Host
我有这个主要的PowerShell函数,它以四种不同的方式调用test.ps1:
#Test0.ps1
cls
$param1 = $True
# 1
.\test1.ps1 -param1
# 2
.\test1.ps1 -param1:$true
# 3
$potato = "-param1:`$$($param1)"
Write-Host "Parameter value: $potato"
.\test1.ps1 $potato
# 4
$command = ".\test1.ps1 -param1:`$$($param1)"
Write-Host "Command: $command"
iex $command
exit
为什么第三种方式失败?我知道我可以做第四种方式,但我很想知道为什么第三种方法失败。
这是输出。因此,所有参数都应为True ,但第三个参数为False ...
param1: True
param1: True
Parameter value: -param1:$True
param1: False
Command: .\test1.ps1 -param1:$True
param1: True
答案 0 :(得分:3)
会发生什么:
"-param1:$true"
param1
,因为您提供的值是string
,而不是switch / bool 如果您使param1
定位,您可以看到PowerShell无法正确绑定它:
function test-parambinding {param([Parameter(Position=0)][switch]$param1);$param1.IsPresent}
test-parambinding "-param1:`$true"
在发生任何其他事情之前,您会看到ParameterArgumentTransformationException
被抛出
答案 1 :(得分:2)
Mathias解释了为什么你传递参数的第三种方式失败了,但还有另一种传递参数的方法,可以让你大致按照你在这里尝试的方式进行操作。
我在这里使用了一个函数,因为调用它时输入的次数要少一些,但是你的脚本文件的工作方式会相同:
PS C:\> function test1() {
param(
[switch] $param1 = $false
)
Write-Host "param1: $($param1.IsPresent)"
Write-Host
}
PS C:\> $param1 = $True
PS C:\> $potato = @{'param1'=$param1}
PS C:\> $potato
Name Value
---- -----
param1 True
PS C:\> test1 @potato
param1: True
因此,不是将参数和值作为单个字符串传递,而是创建一个散列,其参数名称为键,参数为值。然后使用@
splatting运算符调用函数或脚本。 (有关详细信息,请参阅help about_Splatting
。)