Powershell相当于用于分支/运行后台进程的bash&符(&)

在bash中,和号(&)可以用来在后台运行命令,并在命令运行完成之前向用户返回交互控制。 有没有在Powershell中这样做的等效方法?

在bash中的使用示例:

sleep 30 & 

这个问题有几个答案。

  1. 版本1中不能轻松完成
  2. 版本2(现在在社区技术预览版2中)确实有这个function,它被称为作业(以前称为PSJob)。 在这里或这里find更多关于这个。
  3. 实际上,你可以在v1中以困难的方式做到这一点,随时可以拥有它,但我从来没有打扰过。

只要命令是可执行文件或具有关联可执行文件的文件,请使用Start-Process (可从v2获得):

 Start-Process -NoNewWindow ping google.com 

您也可以在个人资料中添加此function:

 function bg() {Start-Process -NoNewWindow @args} 

然后调用变成:

 bg ping google.com 

在我看来,Start-Job对于在后台运行进程的简单用例来说是一个矫枉过正的事情:

  1. 开始作业无权访问您的现有作用域(因为它在单独的会话中运行)。 你不能做“开始工作{记事本$ myfile}”
  2. 开始作业不会保留当前目录(因为它在一个单独的会话中运行)。 您不能执行“Start-Job {notepad myfile.txt}”,其中myfile.txt位于当前目录中。
  3. 输出不会自动显示。 您需要以作业的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中肯定会更容易一些。