Muszę wywołać skrypt PowerShell z pliku wsadowego. Jednym z argumentów skryptu jest wartość logiczna:
C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -NoProfile -File .\RunScript.ps1 -Turn 1 -Unify $false
Polecenie kończy się niepowodzeniem z następującym błędem:
Cannot process argument transformation on parameter 'Unify'. Cannot convert value "System.String" to type "System.Boolean", parameters of this type only accept booleans or numbers, use $true, $false, 1 or 0 instead.
At line:0 char:1
+ <<<< <br/>
+ CategoryInfo : InvalidData: (:) [RunScript.ps1], ParentContainsErrorRecordException <br/>
+ FullyQualifiedErrorId : ParameterArgumentTransformationError,RunScript.ps1
Obecnie używam ciągu znaków do konwersji wartości boolowskiej w moim skrypcie. Ale jak mogę przekazać argumenty logiczne do programu PowerShell?
źródło
Bardziej przejrzystym zastosowaniem może być zamiast tego użycie parametrów przełącznika. Wtedy samo istnienie parametru Unify oznaczałoby, że został on ustawiony.
Tak jak to:
źródło
[switch] $Unify = $false
$false
. Nie ma więc potrzeby jawnego ustawiania wartości domyślnej.To jest starsze pytanie, ale w rzeczywistości jest na nie odpowiedź w dokumentacji programu PowerShell. Miałem ten sam problem i tym razem RTFM faktycznie go rozwiązał. Prawie.
https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_powershell_exe
Dokumentacja dotycząca parametru -File stwierdza, że „W rzadkich przypadkach może być konieczne podanie wartości logicznej dla parametru przełącznika. Aby podać wartość logiczną parametru przełącznika w wartości parametru Plik, należy umieścić nazwę i wartość parametru w nawiasy klamrowe, takie jak: -File. \ Get-Script.ps1 {-All: $ False} "
Musiałem to napisać tak:
Więc nie ma znaku „$” przed stwierdzeniem prawda / fałsz i to zadziałało dla mnie w PowerShell 4.0
źródło
powershell -h
.$
); Zauważ również, że nie jest to już konieczne w programie PowerShell Core . Poprosiłem o poprawienie dokumentacji; patrz github.com/MicrosoftDocs/PowerShell-Docs/issues/4964Spróbuj ustawić typ parametru na
[bool]
:Ten przykład domyślne
$Unity
do$false
jeśli nie jest warunkiem wejścia.Stosowanie
źródło
-File
parametru powinny obejmować każdy aspekt pierwotnego pytania. Zostawię swoją odpowiedź, ponieważ ktoś może również uznać moją wskazówkę dotyczącą podania wartości domyślnej.Myślę, że najlepszym sposobem na użycie / ustawienie wartości logicznej jako parametru jest użycie w skrypcie PS tak:
Więc teraz możesz go używać w ten sposób:
Więc w argumentach z cmd możesz przekazać wartość logiczną jako prosty ciąg :).
źródło
W programie PowerShell parametry logiczne można zadeklarować, podając ich typ przed ich zmienną.
Możesz przypisać wartość, przekazując $ true | $ false
źródło
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ć:Następujące wartości można stosować:
$false
,false
,$true
,true
, ale pamiętać, że zdanie0
lub1
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
Używanie
-Command
zamiast-File
to jedyne skuteczne obejście :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 nietrue
ifalse
, 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ź .
źródło
Coś podobnego miałem podczas przekazywania skryptu do funkcji za pomocą polecenia invoke. Uruchomiłem polecenie w pojedynczych cudzysłowach zamiast w podwójnych cudzysłowach, ponieważ staje się wtedy literałem ciągu.
'Set-Mailbox $sourceUser -LitigationHoldEnabled $false -ElcProcessingDisabled $true';
źródło
Uruchamianie skryptów PowerShell na Linuksie z bash daje ten sam problem. Rozwiązałem to prawie tak samo, jak odpowiedź LarsWA:
Pracujący:
Nie działa:
źródło
Możesz również użyć
0
forFalse
lub1
forTrue
. To faktycznie sugeruje, że w komunikacie o błędzie:Aby uzyskać więcej informacji, zapoznaj się z tym artykułem MSDN dotyczącym wartości logicznych i operatorów .
źródło
-File
interpretuje ją jako łańcuch, więc kończy się niepowodzeniem z tym samym błędem.