如何将布尔值从命令提示符传递给PowerShell脚本
我必须从batch file中调用PowerShell脚本。 其中一个参数是一个布尔值:
C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -NoProfile -File .\RunScript.ps1 -Turn 1 -Unify $false
该命令失败,出现以下错误:
Cannot process argument transformation on parameter 'Unify'. Cannot convert value "System.String" to type "System.Boolean", parameters of this type only accept booleans or numbers, use $true, $false, 1 or 0 instead. At line:0 char:1 + <<<< <br/> + CategoryInfo : InvalidData: (:) [RunScript.ps1], ParentContainsErrorRecordException <br/> + FullyQualifiedErrorId : ParameterArgumentTransformationError,RunScript.ps1
截至目前我正在使用一个string布尔转换内我的脚本。 但是,我怎样才能将布尔parameter passing给PowerShell?
看来,使用-File参数时,powershell.exe不会完全评估脚本参数。 特别的, $false
参数被当作一个string值来处理,与下面的例子类似:
PS> function f( [bool]$b ) { $b }; f -b '$false' f : Cannot process argument transformation on parameter 'b'. Cannot convert value "System.String" to type "System.Boolean", parameters of this type only accept booleans or numbers, use $true, $false, 1 or 0 instead. At line:1 char:36 + function f( [bool]$b ) { $b }; f -b <<<< '$false' + CategoryInfo : InvalidData: (:) [f], ParentContainsErrorRecordException + FullyQualifiedErrorId : ParameterArgumentTransformationError,f
而不是使用-Command
,你可以尝试-Command
,它将评估调用脚本:
CMD> powershell.exe -NoProfile -Command .\RunScript.ps1 -Turn 1 -Unify $false Turn: 1 Unify: False
正如David所言,使用switch参数也会更加通俗,通过不需要显式传递布尔值来简化调用:
CMD> powershell.exe -NoProfile -File .\RunScript.ps1 -Turn 1 -Unify Turn: 1 Unify: True
更清楚的用法可能是使用开关参数。 那么,只要Unify参数的存在就意味着它被设置了。
像这样:
param ( [int] $Turn, [switch] $Unify )
尝试将参数的types设置为[bool]
:
param ( [int]$Turn = 0 [bool]$Unity = $false ) switch ($Unity) { $true { "That was true."; break } default { "Whatever it was, it wasn't true."; break } }
如果没有提供input,这个例子默认$Unity
为$false
。
用法
.\RunScript.ps1 -Turn 1 -Unity $false
这是一个较老的问题,但Powershell文档中实际上有一个答案。 我有同样的问题,一旦RTFM实际上解决了它。 几乎。
-File参数的说明文件指出:“在极less数情况下,您可能需要为开关参数提供一个布尔值。要为File参数的值中的开关参数提供一个布尔值,请将参数名称和值包含在大括号,如下所示:-File。\ Get-Script.ps1 {-All:$ False}“
我必须这样写:
PowerShell.Exe -File MyFile.ps1 {-SomeBoolParameter:False}
所以在true / false语句之前没有'$',这对我来说,在PowerShell 4.0上
我认为,使用/设置布尔值作为参数的最好方法是在你的PS脚本中使用它是这样的:
Param( [Parameter(Mandatory=$false)][ValidateSet("true", "false")][string]$deployApp="false" ) $deployAppBool = $false switch($deployPmCmParse.ToLower()) { "true" { $deployAppBool = $true } default { $deployAppBool = $false } }
所以现在你可以像这样使用它:
.\myApp.ps1 -deployAppBool True .\myApp.ps1 -deployAppBool TRUE .\myApp.ps1 -deployAppBool true .\myApp.ps1 -deployAppBool "true" .\myApp.ps1 -deployAppBool false #and etc...
所以在从CMD的参数,你可以传递布尔值作为简单的string:)。
您也可以使用0
作为False
或使用1
作为True
。 它实际上表明在错误消息中:
无法处理参数“Unify”的参数转换。 无法将值
"System.String"
转换为"System.Boolean"
types,此types的参数只接受布尔值或数字,请改用$true
,$false
, 1或0。
有关更多信息,请查看关于布尔值和运算符的此MSDN文章。