Para resumir e complementar as respostas existentes , a partir do Windows PowerShell v5.1 / PowerShell Core 7.0.0-preview.4:
A resposta de David Mohundro aponta corretamente que, em vez de [bool]parâmetros, você deve usar [switch]parâmetros no PowerShell , onde a presença vs. ausência do nome do switch ( -Unifyespecificado vs. não especificado) implica seu valor , o que faz com que o problema original desapareça.
No entanto, às vezes você ainda pode precisar passar o valor de switch explicitamente , especialmente se você estiver construindo uma linha de comando programaticamente :
No PowerShell Core , o problema original (descrito na resposta do Imperador XLII ) foi corrigido .
Ou seja, para passar $trueexplicitamente para um [switch]parâmetro denominado, -Unifyagora você pode escrever:
pwsh -File .\RunScript.ps1 -Unify:$true # !! ":" separates name and value, no space
Os seguintes valores podem ser usados: $false, false, $true, true, mas nota que passa 0ou 1faz não trabalho.
Observe como o nome do switch é separado do valor com :e não deve haver nenhum espaço em branco entre os dois.
Nota: Se você declarar um [bool]parâmetro em vez de [switch](o que geralmente não deve ser feito), deverá usar a mesma sintaxe; embora -Unify $false deva funcionar, atualmente não funciona - veja este problema do GitHub .
No Windows PowerShell , o problema original persiste e - visto que o Windows PowerShell não é mais desenvolvido ativamente - é improvável que seja corrigido.
A solução alternativa sugerida na resposta do LarsWA - embora seja baseada no tópico de ajuda oficial no momento da redação deste documento - não funciona na v5.1
- Este problema do GitHub pede que a documentação seja corrigida e também fornece um comando de teste que mostra a ineficácia da solução alternativa.
Usar em -Commandvez de -Fileé a única solução alternativa eficaz :
:: # From cmd.exe
powershell -Command "& .\RunScript.ps1 -Unify:$true"
Com -Commandvocê está efetivamente passando uma parte do código do PowerShell , que é então avaliado como de costume - e dentro do PowerShell passando $truee $falsefunciona (mas não true e false, como agora também é aceito com -File).
Advertências :
Usar -Commandpode resultar em uma interpretação adicional de seus argumentos, como se eles contivessem $chars. (com -File, os argumentos são literais ).
O uso -Commandpode resultar em um código de saída diferente .
Para detalhes, veja esta resposta e esta resposta .