Pour résumer et compléter les réponses existantes , à partir de Windows PowerShell v5.1 / PowerShell Core 7.0.0-preview.4:
La réponse de David Mohundro indique à juste titre qu'au lieu de [bool]
paramètres, vous devez utiliser des [switch]
paramètres dans PowerShell , où la présence ou l'absence du nom du commutateur ( -Unify
spécifié ou non spécifié) implique sa valeur , ce qui fait disparaître le problème d'origine.
Cependant, à l'occasion, vous devrez peut-être toujours transmettre la valeur du commutateur explicitement , en particulier si vous construisez une ligne de commande par programme :
Dans PowerShell Core , le problème d'origine (décrit dans la réponse d'Empereur XLII ) a été corrigé .
Autrement dit, pour passer $true
explicitement à un [switch]
paramètre nommé, -Unify
vous pouvez maintenant écrire:
pwsh -File .\RunScript.ps1 -Unify:$true # !! ":" separates name and value, no space
Les valeurs suivantes peuvent être utilisées: $false
, false
, $true
, true
, mais notez que le passage 0
ou 1
ne pas travailler.
Notez comment le nom du commutateur est séparé de la valeur avec :
et il ne doit y avoir aucun espace entre les deux.
Remarque: Si vous déclarez un [bool]
paramètre au lieu de a [switch]
(ce que vous ne devriez généralement pas), vous devez utiliser la même syntaxe; même si cela -Unify $false
devrait fonctionner, cela ne fonctionne pas actuellement - voir ce problème GitHub .
Dans Windows PowerShell , le problème d'origine persiste et, étant donné que Windows PowerShell n'est plus activement développé, il est peu probable qu'il soit résolu.
La solution de contournement suggérée dans la réponse de LarsWA - même si elle est basée sur la rubrique d'aide officielle au moment de la rédaction de cet article - ne fonctionne pas dans la v5.1
- Ce problème GitHub demande que la documentation soit corrigée et fournit également une commande de test qui montre l'inefficacité de la solution de contournement.
Utiliser -Command
au lieu de -File
est la seule solution de contournement efficace :
:: # From cmd.exe
powershell -Command "& .\RunScript.ps1 -Unify:$true"
Avec -Command
vous passez effectivement un morceau de code PowerShell , qui est ensuite évalué comme d'habitude - et à l'intérieur de PowerShell passant $true
et $false
fonctionne (mais pas true
et false
, comme maintenant également accepté avec -File
).
Mises en garde :
L'utilisation -Command
peut entraîner une interprétation supplémentaire de vos arguments, par exemple s'ils contiennent des $
caractères. (avec -File
, les arguments sont des littéraux ).
L'utilisation -Command
peut entraîner un code de sortie différent .
Pour plus de détails, consultez cette réponse et cette réponse .