Ich erstelle ein Powershell-Skript, um Code bereitzustellen, und ein Teil des Prozesses besteht darin, ein Befehlszeilen-Komprimierungsprogramm namens RAR.EXE aufzurufen, um einige Ordner zu sichern.
Ich versuche, die Parameter dynamisch aufzubauen und dann Powershell den Befehl mit den Variablen aufzurufen, aber ich bekomme Probleme. Es funktioniert nicht ...
Führen Sie das folgende Skript aus und Sie sollten sehen, worüber ich rede. Die Parameter, die als Variable übergeben werden, werden gemangelt. Wenn ich den gesamten Befehl + Parameter übergebe, erhalte ich die berüchtigte Meldung "Wird nicht als Cmdlet erkannt ...".
Danke für jede Hilfe!
%Vor%Der Anrufbetreiber '& amp;' ist in diesem Fall unnötig. Es wird verwendet, um einen Befehl in einem neuen Bereich aufzurufen. Dies wird normalerweise verwendet, um einen Befehl aufzurufen, der durch eine Zeichenfolge oder einen Skriptblock angegeben wird. Es hat auch den Nebeneffekt, dass alle in einem PowerShell-Skript erstellten Variablen verworfen werden, nachdem der Befehl beendet wurde und der Bereich verschwindet.
Da die cmd jedoch eine EXE ist, wird sie in einem völlig anderen Prozess ausgeführt. FWIW, Sie erhalten ähnliche Ausgabe direkt von cmd.exe:
%Vor%Also ist das zusätzliche Zitat am Ende ein cmd.exe Problem. Normalerweise müssen Sie den Befehl von den Parametern getrennt halten, wenn PowerShell das Parsing ausführt, um den Befehl aufzurufen, z. B.
%Vor%Die bemerkenswerte Ausnahme ist, dass Invoke-Expression sich wie eine "evaluate this string" -Funktion verhält. Verwenden Sie vorsichtig, vor allem , wenn der Benutzer die Zeichenfolge bereitstellt. Ihr Tag könnte lutschen, wenn sie "ri C: \ -r" zur Verfügung stellen.
In diesem Fall, wie andere vorgeschlagen haben, würde ich die Zeichenfolge / c aus der Zeichenfolge $ param string ziehen und sie beispielsweise angeben:
%Vor%Oder verwenden Sie Invoke-Expression, aber verwenden Sie vorsichtig. Wenn Sie versuchen, Probleme mit dem Senden von Argumenten an EXE über PowerShell zu beheben, lesen Sie das Dienstprogramm "echoargs" in den PowerShell-Community-Erweiterungen ( Ссылка ). Es ist sehr praktisch:
%Vor%Dies zeigt, dass cmd.exe "/ c echo foo" als einzelnes Argument erhält. "/ c" sollte ein separates Argument von "echo foo" (der auszuführende Befehl) sein.
Ihr letztes Beispiel, falls es fehlschlägt, weil "& amp;" behandelt die Zeichenfolge als ein Argument und sucht daher nach einem Programm namens "cmd / c echo foo.exe". :)
Das funktioniert:
%Vor%Wie bei der doppelten Anführungszeichen scheint es, dass cmd die Anführungszeichen um Argumente, die PowerShell setzt, nicht mag. Es bekommt das:
%Vor%Also ich denke, es behandelt alles nach / c als den genauen Befehl, also so:
%Vor%Einige Befehlszeilenprogramme und funky Parsing der Befehlszeile (deshalb übernimmt PowerShell diesen Job für Funktionen und Cmdlets). Im Fall von cmd würde ich Folgendes vorschlagen:
%Vor%Tags und Links command-line arguments powershell parameters command