Menjalankan perintah yang disimpan dalam variabel dari PowerShell

152

Saya punya perintah yang saya buat dan simpan dalam variabel di PowerShell. Perintah ini berfungsi jika saya melakukan Write-Host dan menyalin dan menempel ke cmd.exejendela standar .

Bagaimana cara menjalankan perintah ini dari dalam skrip saya?

Saya telah mencoba beberapa kombinasi Invoke-Command atau Invoke-Expression tanpa hasil.

Ini adalah bagaimana saya membangun variabel:

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

Seperti apa variabelnya jika dicetak ke layar:

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

Jawaban:

207

Berikut ini cara lain tanpa Invoke-Expressiontetapi dengan dua variabel (perintah: string dan parameter: array). Ini bekerja dengan baik untuk saya. Asumsikan 7z.exeada di jalur sistem.

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

& $cmd $prm

Jika perintah diketahui (7z.exe) dan hanya parameter yang variabel maka ini akan dilakukan

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

& 7z.exe $prm

BTW, Invoke-Expressiondengan satu parameter berfungsi untuk saya juga, misalnya ini berfungsi

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

Invoke-Expression $cmd

PS Saya biasanya lebih suka cara dengan array parameter karena lebih mudah untuk menulis secara pemrograman daripada membangun ekspresi Invoke-Expression.

Roman Kuzmin
sumber
Itu hebat. Itu mulai bersatu sekarang. Alih-alih 'c: \ temp \ with space \ test1.zip' dapatkah saya menggunakan $ variabel? Apakah saya perlu menempatkannya "" atau ''?
Travis
Memukul sepertinya bekerja dengan cara yang sama: & $ cmd @prm Tapi saya ingin tahu mengapa
C2H5OH
44

Coba gunakan perintah Anda dengan Invoke-Expression:

Invoke-Expression $cmd1

Berikut ini contoh yang berfungsi pada mesin saya:

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

iexadalah alias untuk Invoke-ExpressionAnda dapat melakukannya:

iex $cmd1

Untuk daftar lengkap: Kunjungi https://ss64.com/ps/ untuk lebih banyak Powershellbarang.

Semoga berhasil...

kbrimington
sumber
Tells me Istilah '7z.exe a -tzip c: \ arc_logs \ site-host-at-web1-100827.zip c: \ inetpub \ logs \ logfiles \ w3svc1 \ u_ex100827.log' tidak dikenal sebagai nama cmdlet, fungsi, file skrip, atau program yang dapat dioperasikan. Periksa ejaan nama, atau jika jalur disertakan, verifikasi jalur itu benar dan coba lagi. At: line: 14 char: 1 + & <<<< $ cmd1
Travis
@ Travis: Ups. ampersand berfungsi jika tidak ada argumen. Saya memperbarui posting dengan solusi untuk perintah Anda.
kbrimington
Saya telah mencoba memohon-ekspresi sebelumnya dan itu tidak berhasil. Meludahkan kesalahan: Konstanta numerik buruk: 7. Pada: baris: 1 char: 2 + 7z <<<< .exe a -tzip c: \ arc_logs \ site-host-at-web1-100827.zip c: \ inetpub \ logs \ logfiles \ w3svc1 \ u_ex100827.log Sepertinya ini mencoba untuk mengevaluasinya daripada menjalankannya.
Travis
@ Travis: Mungkin 7z.exe tidak di jalur Anda. Verifikasi bahwa itu ada di jalur dan / atau coba berikan nama jalur lengkap untuk dieksekusi dalam ekspresi Anda.
kbrimington
1
@ Travis: Saya baru saja mengkonfirmasi pada sistem saya sendiri bahwa 7z.exe memberikan kesalahan yang Anda jelaskan, hanya mengetik dari command prompt, tetapi dengan path lengkap ke 7z.exe (bagi saya, itu 'C:\Program Files\7-zip\7z.exe', saya bisa menjalankan 7z.exe.
kbrimington