scripting - run - Cómo pasar valores booleanos a un script de PowerShell desde un símbolo del sistema
tutorial script powershell (6)
Tengo que invocar un script de PowerShell desde un archivo por lotes. Uno de los argumentos para el script es un valor booleano:
C:/Windows/System32/WindowsPowerShell/v1.0/powershell.exe -NoProfile -File ./RunScript.ps1 -Turn 1 -Unify $false
El comando falla con el siguiente error:
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
A partir de ahora estoy usando una conversión de cadena a booleana dentro de mi script. Pero, ¿cómo puedo pasar argumentos booleanos a PowerShell?
Creo que la mejor manera de usar / establecer el valor booleano como parámetro es usar en tu script PS de esta manera:
Param(
[Parameter(Mandatory=$false)][ValidateSet("true", "false")][string]$deployApp="false"
)
$deployAppBool = $false
switch($deployPmCmParse.ToLower()) {
"true" { $deployAppBool = $true }
default { $deployAppBool = $false }
}
Entonces ahora puedes usarlo así:
./myApp.ps1 -deployAppBool True
./myApp.ps1 -deployAppBool TRUE
./myApp.ps1 -deployAppBool true
./myApp.ps1 -deployAppBool "true"
./myApp.ps1 -deployAppBool false
#and etc...
Entonces en los argumentos de cmd puedes pasar el valor booleano como simple cadena :).
Esta es una pregunta anterior, pero en realidad hay una respuesta a esto en la documentación de PowerShell. Tuve el mismo problema, y por una vez RTFM realmente lo resolvió. Casi.
La documentación para el parámetro -File establece que "En casos poco frecuentes, es posible que deba proporcionar un valor booleano para un parámetro de conmutación. Para proporcionar un valor booleano para un parámetro de conmutación en el valor del parámetro Archivo, incluya el nombre y el valor del parámetro en llaves, como las siguientes: -File. / Get-Script.ps1 {-All: $ False} "
Tenía que escribirlo así:
PowerShell.Exe -File MyFile.ps1 {-SomeBoolParameter:False}
Así que no ''$'' antes de la declaración verdadero / falso, y eso funcionó para mí, en PowerShell 4.0
Intenta configurar el tipo de tu parámetro a [bool]
:
param
(
[int]$Turn = 0
[bool]$Unity = $false
)
switch ($Unity)
{
$true { "That was true."; break }
default { "Whatever it was, it wasn''t true."; break }
}
Este ejemplo predetermina $Unity
a $false
si no se proporciona ninguna entrada.
Uso
./RunScript.ps1 -Turn 1 -Unity $false
Parece que powershell.exe no evalúa por completo los argumentos del script cuando se usa el parámetro -File
. En particular, el argumento $false
se trata como un valor de cadena, de forma similar al ejemplo siguiente:
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
En lugar de usar -File
puede probar -Command
, que evaluará la llamada como script:
CMD> powershell.exe -NoProfile -Command ./RunScript.ps1 -Turn 1 -Unify $false
Turn: 1
Unify: False
Como David sugiere, usar un argumento de cambio también sería más idiomático, simplificando la llamada eliminando la necesidad de pasar un valor booleano explícitamente:
CMD> powershell.exe -NoProfile -File ./RunScript.ps1 -Turn 1 -Unify
Turn: 1
Unify: True
También puede usar 0
para False
o 1
para True
. En realidad, sugiere que en el mensaje de error:
No se puede procesar la transformación de argumentos en el parámetro ''Unificar''. No se puede convertir el valor
"System.String"
para escribir"System.Boolean"
, los parámetros de este tipo solo aceptan booleanos o números, en su lugar se usan$true
,$false
, 1 o 0.
Para obtener más información, consulte este artículo de MSDN sobre operadores y valores booleanos .
Un uso más claro podría ser el uso de parámetros de cambio en su lugar. Entonces, solo la existencia del parámetro Unify significaría que se configuró.
Al igual que:
param (
[int] $Turn,
[switch] $Unify
)