Powershell相当于用于分支/运行后台进程的bash&符(&)
在bash中,和号(&)可以用来在后台运行命令,并在命令运行完成之前向用户返回交互控制。 有没有在Powershell中这样做的等效方法?
在bash中的使用示例:
sleep 30 &
这个问题有几个答案。
- 版本1中不能轻松完成
- 版本2(现在在社区技术预览版2中)确实有这个function,它被称为作业(以前称为PSJob)。 在这里或这里find更多关于这个。
- 实际上,你可以在v1中以困难的方式做到这一点,随时可以拥有它,但我从来没有打扰过。
只要命令是可执行文件或具有关联可执行文件的文件,请使用Start-Process (可从v2获得):
Start-Process -NoNewWindow ping google.com
您也可以在个人资料中添加此function:
function bg() {Start-Process -NoNewWindow @args}
然后调用变成:
bg ping google.com
在我看来,Start-Job对于在后台运行进程的简单用例来说是一个矫枉过正的事情:
- 开始作业无权访问您的现有作用域(因为它在单独的会话中运行)。 你不能做“开始工作{记事本$ myfile}”
- 开始作业不会保留当前目录(因为它在一个单独的会话中运行)。 您不能执行“Start-Job {notepad myfile.txt}”,其中myfile.txt位于当前目录中。
- 输出不会自动显示。 您需要以作业的ID作为参数运行Receive-Job。
注意:关于您的初始示例,“bg sleep 30”将不起作用,因为sleep是一个Powershell命令行开关。 启动过程只在您实际分叉进程时才起作用。
ps2> start-job {start-sleep 20}
我还没有想出如何实时获得标准输出,开始工作需要你用get-job轮询stdout
更新:我不能开始工作轻松地做我想要的基本上是bash&运营商。 这是迄今为止我最好的破解
PS> notepad $profile #edit init script -- added these lines function beep { write-host `a } function ajp { start powershell {ant java-platform|out-null;beep} } #new window, stderr only, beep when done function acjp { start powershell {ant clean java-platform|out-null;beep} } PS> . $profile #re-load profile script PS> ajp
看起来,传递给Start-Job
的脚本块不是使用与Start-Job
命令相同的当前目录执行的,所以如果需要,请确保指定完全限定的path。
例如:
Start-Job { C:\absolute\path\to\command.exe --afileparameter C:\absolute\path\to\file.txt }
您可以使用PowerShell作业cmdlet来实现您的目标。
在PowerShell中有6个与作业相关的cmdlet。
- 获取在职
- 获取当前会话中运行的Windows PowerShell后台作业
- 接收 – 工作
- 获取当前会话中的Windows PowerShell后台作业的结果
- 删除-工作
- 删除Windows PowerShell后台作业
- 启动工作
- 启动Windows PowerShell后台作业
- 停止 – 工作
- 停止Windows PowerShell后台作业
- 等待-工作
- 禁止命令提示符,直到会话中运行的一个或所有Windows PowerShell后台作业完成
如果有趣的话,你可以下载如何在PowerShell中创build后台作业
我已经在PowerShell v1.0中成功使用了http://jtruher.spaces.live.com/blog/cns!7143DA6E51A2628D!130.entry中描述的解决scheme。; 在PowerShell v2.0中肯定会更容易一些。