如何将switch参数传递给另一个PowerShell脚本?

时间:2016-06-24 08:42:54

标签: powershell parameter-passing

我有两个PowerShell脚本,它们有开关参数:

编译tool1.ps1:

[CmdletBinding()]
param(
  [switch]$VHDL2008
)

Write-Host "VHDL-2008 is enabled: $VHDL2008"

compile.ps1:

[CmdletBinding()]
param(
  [switch]$VHDL2008
)

if (-not $VHDL2008)
{ compile-tool1.ps1            }
else
{ compile-tool1.ps1 -VHDL2008  }

如何在不编写大if..then..elsecase语句的情况下将switch参数传递给其他PowerShell脚本?

我不想将$VHDL2008的参数compile-tool1.ps1转换为bool类型,因为这两个脚本都是前端脚本(由用户使用)。后者是多个compile-tool*.ps1脚本的高级包装器。

4 个答案:

答案 0 :(得分:45)

您可以使用冒号语法在交换机上指定$true$false

compile-tool1.ps1 -VHDL2008:$true
compile-tool1.ps1 -VHDL2008:$false

所以只需传递实际值:

compile-tool1.ps1 -VHDL2008:$VHDL2008

答案 1 :(得分:7)

尝试

compile-tool1.ps1 -VHDL2008:$VHDL2008.IsPresent 

答案 2 :(得分:0)

假设您正在迭代开发,很可能在某个时候您将向主脚本添加其他开关和参数,这些开关和参数将传递给下一个调用的脚本。使用前面的响应,每次添加参数时,您都必须查找每个调用并重写该行。在这种情况下,您可以通过执行以下操作来避免开销,

.\compile-tool1.ps1 $($PSBoundParameters.GetEnumerator() | ForEach-Object {"-$($_.Key) $($_.Value)"})

自动变量$PSBoundParameters是一个哈希表,其中包含显式传递给脚本的参数。

请注意,script.ps1 -SomeSwitch等效于script.ps1 -SomeSwitch $truescript.ps1等效于script.ps1 -SomeSwitch $false。因此,将开关设置为false等同于不包括它。

答案 3 :(得分:-1)

另一种解决方案。如果您声明参数的默认值为$ false:

[switch] $VHDL2008 = $false

然后,以下内容(无值的-VHDL2008选项)会将$ VHDL2008设置为$ true:

compile-tool1.ps1 -VHDL2008

如果相反,您省略了-VHDL2008选项,那么这将强制$ VHDL2008使用默认的$ false值:

compile-tool1.ps1

这些示例在从bat脚本调用Powershell脚本时非常有用,因为将$ true / $ false bool从bat传递到Powershell很难,因为bat会尝试将bool转换为字符串,从而导致错误:

Cannot process argument transformation on parameter 'VHDL2008'. 
Cannot convert value "System.String" to type "System.Management.Automation.SwitchParameter". 
Boolean parameters accept only Boolean values and numbers, such as $True, $False, 1 or 0.