PowerShell'den bir değişkende depolanan bir komutu yürütme


152

Ben inşa ve PowerShell bir değişkende depolanan bir komut var. Bu komut, bir Write-Host işlemi yapar ve kopyalayıp bir standarda yapıştırırsam çalışırcmd.exe pencereye .

Bu komutu betiğimin içinden nasıl yürütebilirim?

Invoke-Command veya Invoke-Expression'un birkaç kombinasyonunu şanssız denedim.

Ben bu şekilde inşa:

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

Değişken ekrana yazdırılırsa şöyle görünür:

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

Yanıtlar:


208

Burada Invoke-Expressioniki değişken olmayan ancak başka bir yol var (command: string ve parameters: array). Benim için iyi çalışıyor. Varsayalım 7z.exesistem yolunda.

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

& $cmd $prm

Komut biliniyorsa (7z.exe) ve yalnızca parametreler değişkendir.

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

& 7z.exe $prm

BTW, Invoke-Expressionbir parametre ile benim için de çalışıyor, örneğin, bu çalışıyor

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

Invoke-Expression $cmd

PS Ben genellikle bir parametre dizisi ile yolu tercih çünkü bir ifade oluşturmak için programlı olarak oluşturmak daha kolaydır Invoke-Expression.


Bu harika. Şimdi bir araya gelmeye başlıyor. 'C: \ temp \ ile space \ test1.zip' yerine sadece $ değişkeni kullanabilir miyim? "" Veya "" olduğunu yerleştirmem gerekiyor mu?
Travis

Splatting aynı iş gibi görünüyor: & $ cmd @prm Ama bunu neden merak ediyorum
C2H5OH

44

Komutunuzu şununla çağırmayı deneyin Invoke-Expression:

Invoke-Expression $cmd1

İşte makinemde çalışan bir örnek:

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

iexyapabilmeniz için bir takma addırInvoke-Expression :

iex $cmd1

Tam liste için: Daha fazla bilgi için https://ss64.com/ps/ adresini ziyaret edinPowershell .

İyi şanslar...


Bana '7z.exe a -tzip c: \ arc_logs \ site-host-at-web1-100827.zip c: \ inetpub \ logs \ logfiles \ w3svc1 \ u_ex100827.log' terimi, cmdlet, işlev, kod dosyası veya çalıştırılabilir program. Adın yazımını denetleyin veya bir yol eklenmişse, yolun doğru olduğundan emin olun ve tekrar deneyin. Şurada: line: 14 karakter: 1 + & <<<< $ cmd1
Travis

@Travis: Hata! hiçbir argüman yoksa ve işareti çalışır. Yayını komutunuz için bir çözümle güncelledim.
kbrimington

Daha önce invoke-ifadesini denedim ve işe yaramadı. Hatayı veriyor: Hatalı sayısal sabit: 7. At: line: 1 char: 2 + 7z <<<< .exe a -tzip c: \ arc_logs \ site-host-at-web1-100827.zip c: \ inetpub \ logs \ logfiles \ w3svc1 \ u_ex100827.log Neredeyse yürütmek yerine değerlendirmeye çalışıyor gibi görünüyor.
Travis

@Travis: 7z.exe yolunuzda olmayabilir. Yolda olduğunu doğrulayın ve / veya ifadenizdeki yürütülebilir dosyaya tam yol adını vermeyi deneyin.
kbrimington

1
@Travis: Sadece kendi sistemimde 7z.exe dosyasının sadece komut isteminden yazarak açıkladığınız hatayı verdiğini doğruladım, ancak 7z.exe'ye giden tam yolla (benim için, 'C:\Program Files\7-zip\7z.exe'7z.exe'yi yürütebilirim).
kbrimington
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.