2012-01-04 24 views
7

Parametreler içeren bir .exe olan ve hedefin boşlukları olan bir arka planda bir işi çalıştırmaya çalışıyorum. Örneğin:Arka Plan İşi Powershell'de

foo.exe /param1 /param2, etc. 

Ben Start-Job bunu yapar ama farklı kombinasyonlar tonlarca denedim biliyorum ve o da bana ait çünkü bir hata veriyor:

$exec = "C:\Program Files\foo.exe" 

ve parametreler ile bu çalıştırmak istediğiniz beyaz boşluk veya parametreler nedeniyle. Birisi burada sözdizimi ile bana yardımcı olabilir mi? $exec'un bir yapılandırma dosyasının parçası olduğu ve daha sonra değişebileceği için yürütülebilir dosyanın yolu olduğunu varsaymam gerekir.

cevap

8

Bunu yapmanın bir yolu, bir param bloğu olan script block kullanıyor. Bir dosya/klasör yolu gibi bir boşluğa sahip tek bir argüman varsa, tek bir öğe olarak işlem görmesi için tırnak içine alınmalıdır.Argümanlar komut bloğuna iletilen bir dizidir.

Bu örnek bir komut dosyası bloğu kullanır ama aynı zamanda Start-Job cmdlet'inin yerine -ScriptBlock parametresinin -FilePath parametresini kullanarak bir PowerShell komut dosyasını kullanabilirsiniz. Burada kullanan bir örnek

$scriptBlock = { 
    param (
     [string] $Source, 
     [string] $Destination 
    ) 
    $output = & xcopy $Source $Destination 2>&1 
    return $output 
} 

$job = Start-Job -scriptblock $scriptBlock -ArgumentList 'C:\My Folder', 'C:\My Folder 2' 
Wait-Job $job 
Receive-Job $job 

$args dahili değişken yerine param bloğun Burada

boşluklu bağımsız değişkenler başka bir örnektir.

$scriptBlock = { 
    $output = & xcopy $args 2>&1 
    return $output 
} 

$path1 = "C:\My Folder" 
$path2 = "C:\My Folder 2" 

"hello world" | Out-File -FilePath "$path1\file.txt" 

$job = Start-Job -scriptblock $scriptBlock -ArgumentList $path1, $path2 
Wait-Job $job 
Receive-Job $job 
+0

Yardımın için teşekkürler! 2> & 1 ne anlama geliyor? – Brian

+0

@Brian Ah evet standart hata akışını (2) standart çıkış akışına (1) yönlendirecektir. Bu, "Receive-Job" cmdlet'indeki yürütülebilir dosyadaki tüm metni almanızı sağlar.Genelde arka plan işinde yaptığım şey, bir '$ out = xcopy $ a $ b 2> & 1' olan bir uygulamanın çıkışını yakalar ve çıkış kodunun ('$ LASTEXITCODE') sıfır değerinin olup olmadığını kontrol eder ve eğer yakalanırsa Bir istisna mesaj olarak metin: '$ $ 'dışarı atmak. –

3

Andy'nin numarası genellikle çok iyi çalışıyor.

$jobArgs = @{Source="foo"; Destination="bar"} 
$jobArgs |Export-CliXml -Path $env:\Temp\MyArgs.clixml 

ve işteki

...

Start-Job { 
.... $jobArgs = Import-CliXml -Path $env:\Temp\MyArgs.clixml 
} | Wait-Job | Receive-Job 

Ben rutin her iki yaklaşımı kullanın: Eğer parametre setleri ya da başka şekilde iş haline karmaşık bilgiyi taşımak isterseniz, ayrıca bu tekniği deneyebilirsiniz . ne zaman

Ben -ArgumentList/ScriptBlock parametreleri kullanabilirsiniz:

Ben parametresi ile uğraşan değilim
  • I (ShowUI veya WPK içinde -AsJob yeteneği gibi) bir In-Memory İşi kullanıyorum
  • battığı yere (web sunucuları, ISO uyumlu laboratuvarlar, vs)
argümanlar gerçek nesnelerdir ve bunlar bir işim çalıştırabilirsiniz bir kullanıcı bağlamında koşuyorum
  • ölemez ama diske saklamak edemez

    Eğer bir bilgisayara ihtiyacım varsa lex argümanları ve bellekte geçirilmeleri gerekmez (ya da daha sonra disk üzerinde daha sonra disklerine sahip olmaları uygun değildir), hashtable yaklaşımını kullanacağım.

    Yardım etmek için umarım bu '