Um die vorhandenen Antworten ab Windows PowerShell v5.1 / PowerShell Core 7.0.0-Vorschau 4 zusammenzufassen und zu ergänzen :
Die Antwort von David Mohundro weist zu Recht darauf hin, dass Sie anstelle von [bool]Parametern [switch]Parameter in PowerShell verwenden sollten , bei denen das Vorhandensein oder Nichtvorhandensein des Switch-Namens ( -Unifyangegeben vs. nicht angegeben) dessen Wert impliziert , wodurch das ursprüngliche Problem behoben wird.
Jedoch gelegentlich können Sie immer noch den Schalter übergeben müssen Wert ausdrücklich , vor allem , wenn Sie eine Befehlszeile sind die Konstruktion programmatisch :
In Powershell - Core , das ursprüngliche Problem (beschrieben in Emperor XLII Antwort ) wurde fixiert .
Das heißt, um $trueexplizit an einen [switch]Parameter mit dem Namen zu übergeben -Unify, können Sie jetzt schreiben:
pwsh -File .\RunScript.ps1 -Unify:$true # !! ":" separates name and value, no space
Folgende Werte können verwendet werden: $false, false, $true, true, aber beachten Sie, dass vorbei 0oder 1tut nicht Arbeit.
Beachten Sie, wie der Switch-Name vom Wert mit getrennt wird :und zwischen den beiden kein Leerzeichen stehen darf .
Hinweis: Wenn Sie einen [bool]Parameter anstelle von a deklarieren [switch](was Sie normalerweise nicht tun sollten), müssen Sie dieselbe Syntax verwenden. Auch wenn -Unify $false es funktionieren sollte, funktioniert es derzeit nicht - siehe dieses GitHub-Problem .
In Windows PowerShell besteht das ursprüngliche Problem weiterhin und es ist unwahrscheinlich, dass es behoben wird, da Windows PowerShell nicht mehr aktiv entwickelt wird.
Die Problemumgehung in vorgeschlagen LarsWA Antwort - auch wenn es auf Basis des offiziellen Hilfethema zum Zeitpunkt des Schreibens - tut nicht Arbeit in v5.1
- Dieses GitHub-Problem fordert die Korrektur der Dokumentation an und enthält außerdem einen Testbefehl, der die Ineffektivität der Problemumgehung anzeigt.
Die Verwendung von -Commandanstelle von -Fileist die einzige effektive Problemumgehung :
:: # From cmd.exe
powershell -Command "& .\RunScript.ps1 -Unify:$true"
Mit übergeben -CommandSie effektiv einen Teil des PowerShell-Codes , der dann wie gewohnt ausgewertet wird - und innerhalb von PowerShell übergeben $trueund $falsefunktioniert (aber nicht true und false, wie jetzt auch akzeptiert -File).
Vorsichtsmaßnahmen :
Die Verwendung -Commandkann zu einer zusätzlichen Interpretation Ihrer Argumente führen, z. B. wenn sie $Zeichen enthalten . (mit -File, Argumente sind Literale ).
Die Verwendung -Commandkann zu einem anderen Exit-Code führen .
Einzelheiten finden Sie in dieser Antwort und in dieser Antwort .