Tengo que invocar un script de PowerShell desde un archivo por lotes. Uno de los argumentos del 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 cadena para conversión booleana dentro de mi script. Pero, ¿cómo puedo pasar argumentos booleanos a PowerShell?
fuente
Un uso más claro podría ser utilizar parámetros de cambio en su lugar. Entonces, solo la existencia del parámetro Unify significaría que se estableció.
Al igual que:
fuente
[switch] $Unify = $false
$false
. Por tanto, no es necesario establecer explícitamente un valor predeterminado.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 lo resolvió. Casi.
https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_powershell_exe
La documentación del parámetro -File establece que "En casos excepcionales, es posible que deba proporcionar un valor booleano para un parámetro de cambio. Para proporcionar un valor booleano para un parámetro de cambio 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} "
Tuve que escribirlo así:
Entonces, no hay '$' antes de la declaración de verdadero / falso, y eso funcionó para mí, en PowerShell 4.0
fuente
powershell -h
.$
); También tenga en cuenta que ya no es necesario en PowerShell Core . He pedido que se corrija la documentación; ver github.com/MicrosoftDocs/PowerShell-Docs/issues/4964Intente configurar el tipo de su parámetro en
[bool]
:Este ejemplo valores predeterminados
$Unity
a$false
si no se proporciona de entrada.Uso
fuente
-File
parámetro deben cubrir todos los aspectos de la pregunta original. Dejaré mi respuesta porque alguien también puede encontrar útil mi sugerencia sobre cómo proporcionar un valor predeterminado.Creo que la mejor manera de usar / establecer un valor booleano como parámetro es usarlo en su script PS así:
Entonces ahora puedes usarlo así:
Entonces, en los argumentos de cmd, puede pasar un valor booleano como una cadena simple :).
fuente
En PowerShell, los parámetros booleanos se pueden declarar mencionando su tipo antes de su variable.
Puede asignar valor pasando $ true | $ falso
fuente
Para resumir y complementar las respuestas existentes , a partir de Windows PowerShell v5.1 / PowerShell Core 7.0.0-preview.4:
La respuesta de David Mohundro apunta con razón que, en lugar de
[bool]
parámetros, debe usar[switch]
parámetros en PowerShell , donde la presencia frente a la ausencia del nombre del interruptor (-Unify
especificado frente a no especificado) implica su valor , lo que hace que el problema original desaparezca.Sin embargo, en ocasiones, es posible que deba pasar el valor del conmutador explícitamente , especialmente si está construyendo una línea de comando mediante programación :
En PowerShell Core , el problema original (descrito en la respuesta del Emperador XLII ) se ha solucionado .
Es decir, para pasar
$true
explícitamente a un[switch]
parámetro llamado-Unify
, ahora puede escribir:Los siguientes valores se pueden utilizar:
$false
,false
,$true
,true
, pero tenga en cuenta que la aprobación0
o1
hace no trabajo.Tenga en cuenta que el nombre del conmutador está separado del valor con
:
y no debe haber espacios en blanco entre los dos.Nota: Si declara un
[bool]
parámetro en lugar de a[switch]
(que generalmente no debería), debe usar la misma sintaxis; aunque-Unify $false
debería funcionar, actualmente no lo hace; vea este problema de GitHub .En Windows PowerShell , el problema original persiste y, dado que Windows PowerShell ya no se desarrolla activamente, es poco probable que se solucione.
La solución alternativa sugerida en la respuesta de LarsWA, aunque se basa en el tema de ayuda oficial al momento de escribir este artículo, no funciona en v5.1
Usar en
-Command
lugar de-File
es la única solución eficaz :Con
-Command
está pasando efectivamente una parte del código de PowerShell , que luego se evalúa como de costumbre, y dentro de PowerShell pasa$true
y$false
funciona (pero notrue
yfalse
, como ahora también se acepta-File
).Advertencias :
El uso
-Command
puede resultar en una interpretación adicional de sus argumentos, como si contienen$
caracteres. (con-File
, los argumentos son literales ).El uso
-Command
puede resultar en un código de salida diferente .Para obtener más detalles, consulte esta respuesta y esta respuesta .
fuente
Tuve algo similar al pasar un script a una función con invoke-command. Ejecuté el comando entre comillas simples en lugar de comillas dobles, porque luego se convierte en una cadena literal.
'Set-Mailbox $sourceUser -LitigationHoldEnabled $false -ElcProcessingDisabled $true';
fuente
Ejecutar scripts de powershell en linux desde bash da el mismo problema. Lo resolvió casi igual que la respuesta de LarsWA:
Trabajando:
No funciona:
fuente
También puede utilizar
0
paraFalse
o1
paraTrue
. De hecho, sugiere que en el mensaje de error:Para obtener más información, consulte este artículo de MSDN sobre valores y operadores booleanos .
fuente
-File
interpreta como una cadena, por lo que falla con el mismo error.