为什么此代码将switch参数传递给PowerShell函数失败

时间:2014-11-17 12:28:17

标签: powershell parameters powershell-v3.0

这个问题是关于传递开关参数。我们来看看代码。我有这个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

2 个答案:

答案 0 :(得分:3)

会发生什么:

  1. 解析器查看提供的参数:"-param1:$true"
  2. 无法将其绑定到参数param1,因为您提供的值是string,而不是switch / bool
  3. 位置0不需要特定的参数类型,忽略参数
  4. 如果您使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。)