如何将布尔值从命令提示符传递给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实际上解决了它。 几乎。

https://msdn.microsoft.com/en-us/powershell/scripting/core-powershell/console/powershell.exe-command-line-help

-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$false1或0。

有关更多信息,请查看关于布尔值和运算符的此MSDN文章。