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 ( -Unifyokreś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 $truejawnie 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 0lub 1nie 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 -Commandzamiast -Fileto jedyne skuteczne obejście :
:: # From cmd.exe
powershell -Command "& .\RunScript.ps1 -Unify:$true"
Dzięki -Commandefektywnemu przekazaniu fragmentu kodu PowerShell , który jest następnie oceniany jak zwykle - i wewnątrz PowerShell przechodzi $truei $falsedziała (ale nie true i false, jak teraz jest również akceptowany z -File).
Ostrzeżenia :
Używanie -Commandmoże skutkować dodatkową interpretacją twoich argumentów, na przykład jeśli zawierają one $znaki. (z -Fileargumentami są literały ).
Użycie -Commandmoże skutkować innym kodem zakończenia .
Aby uzyskać szczegółowe informacje, zobacz tę odpowiedź i tę odpowiedź .