2012-01-04 112 views
7

我試圖在後臺運行一個帶參數的.exe文件,目標文件中有空格。例如:Powershell中的後臺作業

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

,我想帶參數運行此:

foo.exe /param1 /param2, etc. 

我知道Start-Job做到這一點,但我已經嘗試噸不同的組合,它要麼給我,因爲一個錯誤白色空間或由於參數。有人能幫我解決這個問題嗎?我需要假設$exec是可執行文件的路徑,因爲它是配置文件的一部分,稍後可能會更改。

回答

8

一種方法是使用帶有參數塊的script block

如果只有一個帶有空格的參數,例如文件/文件夾路徑,則應將其引用爲單個項目。參數是一個傳遞給腳本塊的數組。

本示例使用腳本塊,但您也可以使用cmdlet的-FilePath參數而不是-ScriptBlock參數使用PowerShell腳本。

這裏是具有與空間參數另一個例子:

$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內置變量代替param塊。

$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

感謝您的幫助! 2>&1是什麼意思? – Brian 2012-01-04 18:55:34

+0

@Brian啊是的,這會將標準錯誤流(2)重定向到標準輸出流(1)。這確保您將從'Receive-Job' cmdlet中接收來自可執行文件的所有文本。通常,我在後臺作業中執行的操作是捕獲可執行文件「$ out = xcopy $ a $ b 2>&1」的輸出,然後檢查退出代碼('$ LASTEXITCODE')是否非零,如果是,則拋出捕獲的文本作爲異常消息:'扔$ out'。 – 2012-01-04 19:29:04

3

安迪的伎倆一般工作得很好。如果你有參數集,或以其他方式要複雜的信息移動到工作,你也可以試試這種方法:

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

,並在工作...

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

我用這兩種方法通常。

我用-ArgumentList /腳本塊參數時:

  • 我不是在處理參數設置
  • 我使用一個內存工作(如在顯示用戶界面和朝鮮勞動黨的-AsJob能力),其中論據是真實的對象,
  • 我在那裏我可以運行作業的用戶上下文中運行他們不能死,但不能存儲到磁盤(Web服務器,符合ISO標準的實驗室等)

如果我需要補償lex參數,並且它們不需要在內存中傳遞(或者以其他方式稍後讓它們在磁盤上),我將使用散列表方法。

希望這會有幫助