我試圖在後臺運行一個帶參數的.exe文件,目標文件中有空格。例如:Powershell中的後臺作業
$exec = "C:\Program Files\foo.exe"
,我想帶參數運行此:
foo.exe /param1 /param2, etc.
我知道Start-Job
做到這一點,但我已經嘗試噸不同的組合,它要麼給我,因爲一個錯誤白色空間或由於參數。有人能幫我解決這個問題嗎?我需要假設$exec
是可執行文件的路徑,因爲它是配置文件的一部分,稍後可能會更改。
我試圖在後臺運行一個帶參數的.exe文件,目標文件中有空格。例如:Powershell中的後臺作業
$exec = "C:\Program Files\foo.exe"
,我想帶參數運行此:
foo.exe /param1 /param2, etc.
我知道Start-Job
做到這一點,但我已經嘗試噸不同的組合,它要麼給我,因爲一個錯誤白色空間或由於參數。有人能幫我解決這個問題嗎?我需要假設$exec
是可執行文件的路徑,因爲它是配置文件的一部分,稍後可能會更改。
一種方法是使用帶有參數塊的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
安迪的伎倆一般工作得很好。如果你有參數集,或以其他方式要複雜的信息移動到工作,你也可以試試這種方法:
$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 /腳本塊參數時:
如果我需要補償lex參數,並且它們不需要在內存中傳遞(或者以其他方式稍後讓它們在磁盤上),我將使用散列表方法。
希望這會有幫助
感謝您的幫助! 2>&1是什麼意思? – Brian 2012-01-04 18:55:34
@Brian啊是的,這會將標準錯誤流(2)重定向到標準輸出流(1)。這確保您將從'Receive-Job' cmdlet中接收來自可執行文件的所有文本。通常,我在後臺作業中執行的操作是捕獲可執行文件「$ out = xcopy $ a $ b 2>&1」的輸出,然後檢查退出代碼('$ LASTEXITCODE')是否非零,如果是,則拋出捕獲的文本作爲異常消息:'扔$ out'。 – 2012-01-04 19:29:04