Aby podsumować i uzupełniać istniejące odpowiedzi , jak z Windows PowerShell v5.1 / PowerShell podstawowej 7.0.0-preview.4:
Odpowiedź Davida Mohundro słusznie wskazuje, że zamiast [bool]
parametrów, których należy użyć[switch]
parametrów w PowerShell , gdzie brak obecności w porównaniu z nazwą przełącznik ( -Unify
określony w porównaniu z nie określono) zakłada jej wartość , która sprawia, że oryginalny problem znika.
Jednak przy okazji możesz jeszcze zdać przełącznika wartość wyraźnie , szczególnie jeśli budowie wiersza polecenia programowo :
W programie PowerShell Core The oryginalny problem (opisany w odpowiedzi na cesarza XLII ) został ustalony .
To znaczy, aby $true
jawnie przekazać [switch]
parametr o nazwie -Unify
, możesz teraz napisać:
pwsh -File .\RunScript.ps1 -Unify:$true # !! ":" separates name and value, no space
Następujące wartości można stosować: $false
, false
,$true
, true
, ale pamiętać, że zdanie 0
lub 1
nie nie pracy.
Zwróć uwagę, jak nazwa przełącznika jest oddzielona od wartości :
i nie może być między nimi żadnych spacji .
Uwaga: Jeśli deklarujesz [bool]
parametr zamiast a [switch]
(czego generalnie nie powinieneś), musisz użyć tej samej składni; nawet jeśli-Unify $false
powinno działać, obecnie nie - zobacz ten problem z GitHubem .
W Windows PowerShell , w oryginalnych problem nie ustąpi , i - biorąc pod uwagę, że Windows PowerShell nie jest już aktywnie rozwijany - jest mało prawdopodobne, aby uzyskać stałe.
Obejście sugerowane w odpowiedzi LarsWA - mimo że jest oparte na oficjalnym temacie pomocy w chwili pisania tego tekstu - nie działa w wersji 5.1
- Ten problem z GitHubem wymaga poprawienia dokumentacji, a także zawiera polecenie testowe, które pokazuje nieskuteczność obejścia.
Używanie -Command
zamiast -File
to jedyne skuteczne obejście :
:: # From cmd.exe
powershell -Command "& .\RunScript.ps1 -Unify:$true"
Dzięki -Command
efektywnemu przekazaniu fragmentu kodu PowerShell , który jest następnie oceniany jak zwykle - i wewnątrz PowerShell przechodzi $true
i $false
działa (ale nie true
i false
, jak teraz jest również akceptowany z -File
).
Ostrzeżenia :
Używanie -Command
może skutkować dodatkową interpretacją twoich argumentów, na przykład jeśli zawierają one $
znaki. (z -File
argumentami są literały ).
Użycie -Command
może skutkować innym kodem zakończenia .
Aby uzyskać szczegółowe informacje, zobacz tę odpowiedź i tę odpowiedź .