Powershell中的背景工作

时间:2012-01-04 01:31:05

标签: powershell process background start-job

我正在尝试在后台运行一个带有参数的.exe并且目标有空格的作业。例如:

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

我想用参数运行它:

foo.exe /param1 /param2, etc.

我知道Start-Job这样做但是我尝试了很多不同的组合,它或者由于空白或参数而给我一个错误。有人可以帮我解决这里的语法吗?我需要假设$exec是可执行文件的路径,因为它是配置文件的一部分,可能会在以后更改。

2 个答案:

答案 0 :(得分:8)

执行此操作的一种方法是使用带有参数块的script block

如果有一个带有空格的参数,例如文件/文件夹路径,则应引用该参数将其视为单个项目。参数是传递给脚本块的数组。

此示例使用脚本块,但您也可以使用-FilePath cmdlet的Start-Job参数而不是-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

答案 1 :(得分: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 / ScriptBlock参数:

  • 我没有处理参数集
  • 我正在使用内存中的作业(比如ShowUI或WPK中的-AsJob功能),其中参数是真实对象,并且它们不会死亡
  • 我在用户上下文中运行,我可以在其中运行作业,但无法存储到磁盘(Web服务器,ISO兼容实验室等)

如果我需要复杂的参数,并且它们不需要在内存中传递(或者以后方便将它们放在磁盘上),我将使用散列表方法。

希望这有助于