Ich muss ein PowerShell-Skript aus einer Batchdatei aufrufen. Eines der Argumente für das Skript ist ein boolescher Wert:
C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -NoProfile -File .\RunScript.ps1 -Turn 1 -Unify $false
Der Befehl schlägt mit folgendem Fehler fehl:
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
Ab sofort verwende ich eine Zeichenfolge zur booleschen Konvertierung in meinem Skript. Aber wie kann ich boolesche Argumente an PowerShell übergeben?
quelle
Eine klarere Verwendung könnte darin bestehen, stattdessen Schalterparameter zu verwenden. Dann würde nur das Vorhandensein des Unify-Parameters bedeuten, dass er festgelegt wurde.
Wie so:
quelle
[switch] $Unify = $false
$false
. Es ist also nicht erforderlich, einen Standardwert explizit festzulegen.Dies ist eine ältere Frage, aber in der PowerShell-Dokumentation gibt es tatsächlich eine Antwort darauf. Ich hatte das gleiche Problem und ausnahmsweise löste RTFM es tatsächlich. Fast.
https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_powershell_exe
In der Dokumentation für den Parameter -File heißt es: "In seltenen Fällen müssen Sie möglicherweise einen Booleschen Wert für einen Switch-Parameter angeben. Um einen Booleschen Wert für einen Switch-Parameter im Wert des File-Parameters anzugeben, geben Sie den Parameternamen und den Wert in an geschweifte Klammern wie die folgenden: -File. \ Get-Script.ps1 {-All: $ False} "
Ich musste es so schreiben:
Also kein '$' vor der wahr / falsch-Anweisung, und das hat bei mir unter PowerShell 4.0 funktioniert
quelle
powershell -h
.$
). Beachten Sie außerdem, dass dies in PowerShell Core nicht mehr erforderlich ist . Ich habe darum gebeten, dass die Dokumentation korrigiert wird. siehe github.com/MicrosoftDocs/PowerShell-Docs/issues/4964Versuchen Sie, den Typ Ihres Parameters auf Folgendes einzustellen
[bool]
:Dieses Beispiel Standardwert
$Unity
an ,$false
wenn keine Eingabe vorgesehen ist.Verwendung
quelle
-File
Parameter sollten jeden Aspekt der ursprünglichen Frage abdecken. Ich werde meine Antwort hinterlassen, da möglicherweise auch jemand meinen Hinweis zur Angabe eines Standardwerts nützlich findet.Ich denke, der beste Weg, einen booleschen Wert als Parameter zu verwenden / festzulegen, besteht darin, ihn in Ihrem PS-Skript folgendermaßen zu verwenden:
Jetzt können Sie es so verwenden:
In Argumenten von cmd können Sie also einen booleschen Wert als einfache Zeichenfolge übergeben :).
quelle
In PowerShell können boolesche Parameter deklariert werden, indem ihr Typ vor ihrer Variablen angegeben wird.
Sie können einen Wert zuweisen, indem Sie $ true | übergeben $ false
quelle
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:Folgende Werte können verwendet werden:
$false
,false
,$true
,true
, aber beachten Sie, dass vorbei0
oder1
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
Die Verwendung von
-Command
anstelle von-File
ist die einzige effektive Problemumgehung :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 nichttrue
undfalse
, 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 .
quelle
Ich hatte etwas Ähnliches, als ich ein Skript an eine Funktion mit dem Befehl invoke übergab. Ich habe den Befehl in einfachen Anführungszeichen anstelle von doppelten Anführungszeichen ausgeführt, da er dann zu einem Zeichenfolgenliteral wird.
'Set-Mailbox $sourceUser -LitigationHoldEnabled $false -ElcProcessingDisabled $true';
quelle
Das Ausführen von Powershell-Skripten unter Linux unter Bash führt zum gleichen Problem. Es wurde fast genauso gelöst wie die Antwort von LarsWA:
Arbeiten:
Funktioniert nicht:
quelle
Sie können auch
0
fürFalse
oder1
für verwendenTrue
. Es schlägt tatsächlich vor, dass in der Fehlermeldung:Weitere Informationen finden Sie in diesem MSDN-Artikel zu Booleschen Werten und Operatoren .
quelle
-File
interpretiert sie als Zeichenfolge und schlägt daher mit demselben Fehler fehl.