Powershell 后台任务

Dus*_*etz 3 powershell

如何在 Powershell 中执行后台任务?

$ ant >/dev/null &        #cygwin
Run Code Online (Sandbox Code Playgroud)

我在 Powershell 中最接近这个的是

ps2> start-job {ant |out-null; `a}   #powershell
Run Code Online (Sandbox Code Playgroud)

但后来我没有得到实时输出,也没有听到哔哔声。我必须用接收作业轮询它,并在标准输出被轮询时发出哔哔声。

EBG*_*een 6

希望您使用的是 Powershell 版本 2。如果您是,那么这就是后台处理作业的方法:

Start-Job {Get-Process}
Run Code Online (Sandbox Code Playgroud)

这将在后台运行作业。如果要与作业交互,只需将其分配给一个变量:

$foo = Start-Job {Get-Process}
Run Code Online (Sandbox Code Playgroud)

当然,棘手的是要知道工作何时完成。我意识到这就是您在原始示例中放置的铃铛的目的。不幸的是,Powershell 一直管着管道,直到您要求工作的结果。要从作业中获取结果,请使用 Receive-Job cmdlet:

Receive-Job $foo
Run Code Online (Sandbox Code Playgroud)

我对一种在后台作业完成时发出警报的方式很感兴趣,因此我将继续寻找解决方案。

哦还有更多信息:

Get-Help about_jobs
Run Code Online (Sandbox Code Playgroud)

好的,这里是如何在完成时发出哔哔声。首先,请阅读当后台作业完成时获取通知(顺便说一下,这是一个很棒的资源站点)。我在那里获取了信息,并将此功能添加到我的个人资料中:

function Register-JobWait{
param(
        $Job
     )
Register-ObjectEvent $job StateChanged -Action {
[Console]::Beep(1000,500)
$eventSubscriber | Unregister-Event
$eventSubscriber.Action | Remove-Job
} | Out-Null
Run Code Online (Sandbox Code Playgroud)

}

我还在我的个人资料中添加了一个别名:

set-alias rjw Register-JobWait
Run Code Online (Sandbox Code Playgroud)

所以现在如果我想后台处理一些事情,我会这样做:

$foo = Start-Job {1..10 | Get-Process}
rjw $foo
Run Code Online (Sandbox Code Playgroud)

我等待哔声然后:

Receive-Job $foo
Run Code Online (Sandbox Code Playgroud)