Powershell中的后台作业

Powershell中的后台作业,powershell,process,background,start-job,Powershell,Process,Background,Start Job,我正在尝试在后台运行一个作业,该作业是一个带有参数的.exe,目标有空格。例如: $exec = "C:\Program Files\foo.exe" 我想用参数来运行它: foo.exe /param1 /param2, etc. 我知道Start Job会执行此操作,但我尝试了大量不同的组合,它要么给我一个错误,因为有空格,要么因为参数。有人能帮我解释一下这里的语法吗?我需要假设$exec是可执行文件的路径,因为它是配置文件的一部分,以后可能会更改 实现这一点的一种方法是将a与param

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

$exec = "C:\Program Files\foo.exe"
我想用参数来运行它:

foo.exe /param1 /param2, etc.

我知道
Start Job
会执行此操作,但我尝试了大量不同的组合,它要么给我一个错误,因为有空格,要么因为参数。有人能帮我解释一下这里的语法吗?我需要假设
$exec
是可执行文件的路径,因为它是配置文件的一部分,以后可能会更改

实现这一点的一种方法是将a与param块一起使用

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

此示例使用脚本块,但也可以使用
启动作业
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/ScriptBlock参数:

  • 我不是在处理参数集
  • 我使用的是内存中的作业(比如ShowUI或WPK中的-AsJob功能),其中的参数是真实对象,它们不会消失
  • 我在一个用户环境中运行,在这个环境中我可以运行作业,但不能存储到磁盘(web服务器、符合ISO标准的实验室等)
如果我需要复杂的参数,并且它们不需要在内存中传递(或者以后将它们放在磁盘上比较方便),我将使用哈希表方法


希望这有帮助

谢谢你的帮助!2>&1是什么意思?@Brian Ah yes这将把标准错误流(2)重定向到标准输出流(1)。这确保您将从
receive Job
cmdlet接收可执行文件中的所有文本。通常,我在后台作业中所做的是捕获可执行文件的输出
$out=xcopy$a$b2>&1
,然后检查退出代码(
$LASTEXITCODE
)是否为非零,如果是,则将捕获的文本作为异常消息抛出:
抛出$out