/ / Rufen Sie PowerShell-Skript aus Batch-Datei mit allen Parametern auf - Windows, Powershell, Batch-Datei

Rufen Sie PowerShell-Skript aus Batch-Datei mit allen Parametern auf - Windows, Powershell, Batch-Datei

Diese Frage und dieser Blogbeitrag Beschreiben Sie, wie bestimmte Parameter aus einer Batchdatei in ein PowerShell-Skript übergeben werden.

Wie kann man alle Parameter in das PowerShell-Skript übergeben? Grundsätzlich möchte ich alle Parameter splat, so dass die Batch-Datei alle Argumente transparent übergibt.

Bearbeiten für mehr Kontext:

Ich verwende derzeit eine Zeile wie:

PowerShell.exe -Command "& "%~dpn0.ps1" "%1" "%2""

Dies funktioniert, aber schafft eine Redundanz zwischen denDateien, so dass, wenn ich das PowerShell-Skript aktualisieren, um verschiedene Argumente zu nehmen, ich auch das Batch-Skript aktualisieren muss. Was wäre schön, wenn ich etwas tun könnte wie:

PowerShell.exe -Command "& "%~dpn0.ps1" "%*""

Antworten:

6 für die Antwort № 1

Versuche Folgendes:

powershell -File "%~dpn0.ps1" %*
  • In Stapeldateien, %* repräsentiert alle übergebenen Argumente.[1]

  • -File ist der Parameter zum Aufrufen Skripte über die PowerShell-CLI.

  • Alle verbleibenden Argumente werden dann als übergeben wie es ist (wohingegen -Command würde sie einer weiteren Interpretationsrunde von PowerShell unterziehen[2] ).

[1] Beachten Sie, dass für cmd.exe (Batch-Dateien), um ein Argument mit eingebetteten Leerzeichen als einzelnes Argument zu erkennen, müssen Sie es einschließen "...".
Zum Beispiel, wenn Sie Argumente übergeben wollten a und b c zu Batch-Datei file.cmd, du würdest es so nennen
file a "b c".
Bestehen eingebettet " Instanzen, -scape sie; z.B., ""b c"" macht PowerShell sehen "b c"einschließlich der doppelten Anführungszeichen.
Wenn Sie diese Regeln beachten, %* - ohne zu quotieren - übergibt das Array von Argumenten richtig.
Machen nicht benutzen "%*" - Es wird nicht wie erwartet funktionieren.

[2] Tatsächlich -Command bewirkt, dass zu allen folgenden Argumenten jeweils ein Leerzeichen hinzugefügt wird resultierende Zeichenfolge wird dann interpretiert als PowerShell-Befehl Das heißt, nachdem die Argumente nach den Regeln von cmd.exe (Batch-Dateien) unterliegen sie Ein weiterer Runde von Parsing, von PowerShell.
Leider hat PowerShell immer auf diese Weise funktioniert, aber das Verhalten ist unklar und wird wahrscheinlich noch mehr Verwirrung in der Unix-Welt verursachen, da PowerShell jetzt plattformübergreifend ist - siehe dieses GitHub-Problem.