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:
pwsh -File .\RunScript.ps1 -Unify:$true # !! ":" separates name and value, no space
Los siguientes valores se pueden utilizar: $false
, false
, $true
, true
, pero tenga en cuenta que la aprobación 0
o 1
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
- Este problema de GitHub solicita que se corrija la documentación y también proporciona un comando de prueba que muestra la ineficacia de la solución.
Usar en -Command
lugar de -File
es la única solución eficaz :
:: # From cmd.exe
powershell -Command "& .\RunScript.ps1 -Unify:$true"
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 no true
y false
, 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 .