Ausführen eines Befehls, der in einer Variablen von PowerShell gespeichert ist


152

Ich habe einen Befehl, den ich in einer Variablen in PowerShell erstellt und gespeichert habe. Dieser Befehl funktioniert, wenn ich einen Write-Host ausführe und in ein Standardfenster kopiere und einfüge cmd.exe.

Wie führe ich diesen Befehl in meinem Skript aus?

Ich habe mehrere Kombinationen von Invoke-Command oder Invoke-Expression ohne Glück ausprobiert.

So habe ich die Variable erstellt:

$cmd1 = $arcprg + $arcdir + "\" + $site1 + "-" + $hst + "-" + $yesterday + ".zip " + $logpath1 + "u_ex" + $yesterday + ".log"

So sieht die Variable aus, wenn sie auf dem Bildschirm gedruckt wird:

7z.exe a -tzip c:\arc_logs\site-host-at-web1-100827.zip c:\inetpub\logs\logfiles\w3svc1\u_ex100827.log

Antworten:


206

Hier ist noch ein anderer Weg ohne, Invoke-Expressionaber mit zwei Variablen (Befehl: Zeichenfolge und Parameter: Array). Es funktioniert gut für mich. Angenommen, es 7z.exebefindet sich im Systempfad.

$cmd = '7z.exe'
$prm = 'a', '-tzip', 'c:\temp\with space\test1.zip', 'C:\TEMP\with space\changelog'

& $cmd $prm

Wenn der Befehl bekannt ist (7z.exe) und nur Parameter variabel sind, reicht dies aus

$prm = 'a', '-tzip', 'c:\temp\with space\test1.zip', 'C:\TEMP\with space\changelog'

& 7z.exe $prm

Übrigens, Invoke-Expressionmit einem Parameter funktioniert das auch bei mir, zB funktioniert das

$cmd = '& 7z.exe a -tzip "c:\temp\with space\test2.zip" "C:\TEMP\with space\changelog"'

Invoke-Expression $cmd

PS Normalerweise bevorzuge ich den Weg mit einem Parameterarray, weil es einfacher ist, programmgesteuert zu komponieren, als einen Ausdruck für zu erstellen Invoke-Expression.


Das ist großartig. Es fängt jetzt an zusammen zu kommen. Kann ich anstelle von 'c: \ temp \ with space \ test1.zip' einfach eine $ -Variable verwenden? Muss ich platzieren, dass es "" oder '' ist?
Travis

Splatting scheint genauso zu funktionieren: & $ cmd @prm Aber ich bin gespannt, warum das so ist
C2H5OH

44

Versuchen Sie, Ihren Befehl aufzurufen mit Invoke-Expression:

Invoke-Expression $cmd1

Hier ist ein Arbeitsbeispiel auf meiner Maschine:

$cmd = "& 'C:\Program Files\7-zip\7z.exe' a -tzip c:\temp\test.zip c:\temp\test.txt"
Invoke-Expression $cmd

iexist ein Alias für Invoke-Expressionso könnte man tun:

iex $cmd1

Für eine vollständige Liste: Besuch https://ss64.com/ps/ für mehr PowershellSachen.

Viel Glück...


Sagt mir Der Begriff '7z.exe a -tzip c: \ arc_logs \ site-host-at-web1-100827.zip c: \ inetpub \ logs \ logfiles \ w3svc1 \ u_ex100827.log' wird nicht als Name von a erkannt Cmdlet, Funktion, Skriptdatei oder bedienbares Programm. Überprüfen Sie die Schreibweise des Namens. Wenn ein Pfad enthalten war, überprüfen Sie, ob der Pfad korrekt ist, und versuchen Sie es erneut. At: line: 14 char: 1 + & <<<< $ cmd1
Travis

@ Travis: Ups. Das kaufmännische Und funktioniert, wenn keine Argumente vorhanden sind. Ich habe den Beitrag mit einer Lösung für Ihren Befehl aktualisiert.
Kbrimington

Ich habe schon einmal versucht, den Ausdruck aufzurufen, und es hat nicht funktioniert. Es spuckt den Fehler aus: Ungültige numerische Konstante: 7. Bei: Zeile: 1 Zeichen: 2 + 7z <<<< .exe a -tzip c: \ arc_logs \ site-host-at-web1-100827.zip c: \ inetpub \ logs \ logfiles \ w3svc1 \ u_ex100827.log Es scheint fast so, als würde versucht, es auszuwerten, anstatt es auszuführen.
Travis

@Travis: Es kann sein, dass 7z.exe nicht auf Ihrem Weg ist. Stellen Sie sicher, dass es sich im Pfad befindet, und / oder geben Sie der ausführbaren Datei in Ihrem Ausdruck den vollständigen Pfadnamen.
Kbrimington

1
@Travis: Ich habe gerade auf meinem eigenen System bestätigt, dass 7z.exe den von Ihnen beschriebenen Fehler ausgegeben hat. Ich habe nur an der Eingabeaufforderung eingegeben, aber mit dem vollständigen Pfad zu 7z.exe (für mich war es 'C:\Program Files\7-zip\7z.exe', dass ich 7z.exe ausführen konnte.
Kbrimington
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.