如何在 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)
但后来我没有得到实时输出,也没有听到哔哔声。我必须用接收作业轮询它,并在标准输出被轮询时发出哔哔声。
希望您使用的是 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)
| 归档时间: |
|
| 查看次数: |
2107 次 |
| 最近记录: |