我有两个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..else
或case
语句的情况下将switch参数传递给其他PowerShell脚本?
我不想将$VHDL2008
的参数compile-tool1.ps1
转换为bool
类型,因为这两个脚本都是前端脚本(由用户使用)。后者是多个compile-tool*.ps1
脚本的高级包装器。
答案 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 $true
,script.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.