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

问题描述 投票:28回答:3

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

编译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脚本的高级包装器。

powershell parameter-passing
3个回答
47
投票

您可以使用冒号语法在开关上指定$true$false

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

所以只需传递实际值:

compile-tool1.ps1 -VHDL2008:$VHDL2008

7
投票

尝试

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

-1
投票

另一种方法。如果使用默认值$ false声明参数:

[switch] $VHDL2008 = $false

然后,以下(没有值的-VHDL2008选项)将$ VHDL2008设置为$ true:

compile-tool1.ps1 -VHDL2008

如果您省略-VHDL2008选项,则强制$ VHDL2008使用默认的$ false值:

compile-tool1.ps1

这些示例在从bat脚本调用Powershell脚本时非常有用,因为从bat传递$ true / $ false bool到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.
© www.soinside.com 2019 - 2024. All rights reserved.