在bash中,&号(&)可用于在后台运行命令,并在命令运行完成之前将交互控制返回给用户。在Powershell中是否有等效的方法来做到这一点?

在bash中的用法示例:

 sleep 30 &

当前回答

只要命令是一个可执行文件,或者是一个具有相关可执行文件的文件,就可以使用Start-Process(从v2可用):

Start-Process -NoNewWindow ping google.com

你也可以在你的配置文件中添加这个函数:

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

然后调用变成:

bg ping google.com

在我看来,对于在后台运行进程的简单用例来说,Start-Job是一种过度使用:

Start-Job不能访问现有的作用域(因为它在单独的会话中运行)。无法执行“Start-Job {notepad $myfile}” Start-Job不保存当前目录(因为它在单独的会话中运行)。不能执行“Start-Job {notepad myfile.txt}”,其中myfile.txt位于当前目录。 输出结果不会自动显示。您需要以作业ID为参数运行Receive-Job。

注意:对于您最初的示例,“bg sleep 30”将不起作用,因为sleep是一个Powershell命令行。Start-Process只在实际fork一个进程时才有效。

其他回答

你可以这样做。

$a = start-process -NoNewWindow powershell {timeout 10; 'done'} -PassThru

如果你想等的话:

$a | wait-process

额外的osx或linux版本:

$a = start-process pwsh '-c',{start-sleep 5; 'done'} -PassThru 

示例ping脚本我有。参数作为数组传递:

$1 = start -n powershell pinger,comp001 -pa

您可以使用PowerShell作业cmdlet来实现您的目标。

在PowerShell中有6个与作业相关的cmdlet可用。

得到工作 获取在当前会话中运行的Windows PowerShell后台作业 接受职业 获取当前会话中Windows PowerShell后台作业的结果 Remove-Job 删除Windows PowerShell后台作业 启动作业 启动Windows PowerShell后台作业 Stop-Job 停止Windows PowerShell后台作业 Wait-Job 抑制命令提示符,直到会话中运行的一个或所有Windows PowerShell后台作业完成

如果感兴趣,可以下载如何在PowerShell中创建后台作业的示例

我已经在PowerShell v1.0中成功地使用了这里描述的解决方案http://jtruher.spaces.live.com/blog/cns!7143DA6E51A2628D!130.entry。在PowerShell v2.0中,这肯定会更容易。

只要命令是一个可执行文件,或者是一个具有相关可执行文件的文件,就可以使用Start-Process(从v2可用):

Start-Process -NoNewWindow ping google.com

你也可以在你的配置文件中添加这个函数:

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

然后调用变成:

bg ping google.com

在我看来,对于在后台运行进程的简单用例来说,Start-Job是一种过度使用:

Start-Job不能访问现有的作用域(因为它在单独的会话中运行)。无法执行“Start-Job {notepad $myfile}” Start-Job不保存当前目录(因为它在单独的会话中运行)。不能执行“Start-Job {notepad myfile.txt}”,其中myfile.txt位于当前目录。 输出结果不会自动显示。您需要以作业ID为参数运行Receive-Job。

注意:对于您最初的示例,“bg sleep 30”将不起作用,因为sleep是一个Powershell命令行。Start-Process只在实际fork一个进程时才有效。

传递给Start-Job的脚本块似乎没有在与Start-Job命令相同的当前目录下执行,因此如果需要,请确保指定完全限定的路径。

例如:

Start-Job { C:\absolute\path\to\command.exe --afileparameter C:\absolute\path\to\file.txt }