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 ( -Unify
angegeben 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 $true
explizit 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 0
oder 1
tut 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 -Command
anstelle von -File
ist die einzige effektive Problemumgehung :
:: # From cmd.exe
powershell -Command "& .\RunScript.ps1 -Unify:$true"
Mit übergeben -Command
Sie effektiv einen Teil des PowerShell-Codes , der dann wie gewohnt ausgewertet wird - und innerhalb von PowerShell übergeben $true
und $false
funktioniert (aber nicht true
und false
, wie jetzt auch akzeptiert -File
).
Vorsichtsmaßnahmen :
Die Verwendung -Command
kann zu einer zusätzlichen Interpretation Ihrer Argumente führen, z. B. wenn sie $
Zeichen enthalten . (mit -File
, Argumente sind Literale ).
Die Verwendung -Command
kann zu einem anderen Exit-Code führen .
Einzelheiten finden Sie in dieser Antwort und in dieser Antwort .