Powershell-Befehlsverarbeitung (Übergabe von Variablen)

7

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%     
GabeA 30.04.2009, 22:04
quelle

6 Antworten

9

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.

    
Keith Hill 01.05.2009, 18:01
quelle
8

Eine andere Möglichkeit, dies zu tun, war, ein Array von Argumenten für die Befehlszeile zu erstellen und dieses mit dem apersand & amp; Anruf Betreiber. Etwas wie das:

%Vor%

Es hat gut für mich gearbeitet.

Ich habe diese Technik ursprünglich hier gefunden: Ссылка

    
Tom Hazel 09.12.2009 18:28
quelle
6

Ich hatte Probleme mit der & amp; Rufen Sie den Operator in der Vergangenheit auf, wenn Sie versuchen, ausführbare Befehle wie gewünscht aufzurufen. Nicht sicher, warum ich verstehe. Invoke-Expression scheint jedoch immer in diesem Kontext zu funktionieren:

%Vor%     
zdan 01.05.2009 01:15
quelle
3

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%     
JasonMArcher 01.05.2009 02:02
quelle
0

Argumente werden anders behandelt, wenn sie in einem String enthalten sind:

%Vor%

Die gleichen Ergebnisse treten auf, wenn Sie eine Variable für die Argumente verwenden:

%Vor%

Die LÖSUNG besteht darin, ein Array zu verwenden:

%Vor%     
cmcginty 20.12.2012 00:52
quelle
0

es ist ein Artefakt der Verwendung von cmd / c, denke ich. läuft

%Vor%

funktioniert gut. Es sei denn, Sie haben ein echtes Codebeispiel, es ist ein bisschen schwierig zu schieβen.

    
Orihara 01.05.2009 00:00
quelle