Answers:
只要命令是可执行文件或具有关联可执行文件的文件,请使用Start-Process(可从v2获得):
Start-Process -NoNewWindow ping google.com
您也可以将此功能添加到您的个人资料中:
function bg() {Start-Process -NoNewWindow @args}
然后调用变为:
bg ping google.com
我认为,对于在后台运行流程的简单用例而言,Start-Job是一个过分的矫正:
注意:关于您的第一个示例,“ bg sleep 30”将不起作用,因为睡眠是Powershell Commandlet。仅当您真正分叉一个进程时,启动进程才起作用。
Start-Process
,它将在shell终止后继续存在,但是,如果您从控制台窗口启动该脚本,则它将始终绑定到该窗口,并且关闭该窗口将终止该进程。
Start-Process
因此这将不起作用:Start-Process {ping -n 1000 example.com > ping__example.com.txt }
。同样的方法也可以Start-Job
正常工作(尽管您必须使用输出文件的完整路径)。
似乎传递给的脚本块Start-Job
未与Start-Job
命令使用相同的当前目录执行,因此请确保在需要时指定完全限定的路径。
例如:
Start-Job { C:\absolute\path\to\command.exe --afileparameter C:\absolute\path\to\file.txt }
ps2> start-job {start-sleep 20}
我尚未弄清楚如何实时获取stdout,start-job要求您使用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 { Write-Output 'Hello world' } | Receive-Job -Wait
在PowerShell Core 6.0中,您可以&
在命令末尾编写代码,这等效于在后台在当前工作目录中运行管道。
它不等同&
于bash,只是当前PowerShell 作业功能的更好语法。它返回一个作业对象,因此您可以使用将用于作业的所有其他命令。例如Receive-Job
:
C:\utils> ping google.com &
Id Name PSJobTypeName State HasMoreData Location Command
-- ---- ------------- ----- ----------- -------- -------
35 Job35 BackgroundJob Running True localhost Microsoft.PowerShell.M...
C:\utils> Receive-Job 35
Pinging google.com [172.217.16.14] with 32 bytes of data:
Reply from 172.217.16.14: bytes=32 time=11ms TTL=55
Reply from 172.217.16.14: bytes=32 time=11ms TTL=55
Reply from 172.217.16.14: bytes=32 time=10ms TTL=55
Reply from 172.217.16.14: bytes=32 time=10ms TTL=55
Ping statistics for 172.217.16.14:
Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
Minimum = 10ms, Maximum = 11ms, Average = 10ms
C:\utils>
如果要在后台执行几条语句,可以将&
调用操作符,{ }
脚本块和此新的&
后台操作符组合在一起,如下所示:
& { cd .\SomeDir\; .\SomeLongRunningOperation.bat; cd ..; } &
这是来自文档页面的更多信息:
支持使用&号(&)的管道背景(#3360)
放置
&
在管道的末尾会使管道作为PowerShell作业运行。当管道后台运行时,将返回作业对象。管道作为作业运行后,所有标准*-Job
cmdlet均可用于管理作业。管道中使用的变量(忽略特定于流程的变量)会自动复制到作业中,因此Copy-Item $foo $bar &
可以正常工作。该作业还将在当前目录而不是用户的主目录中运行。有关PowerShell作业的更多信息,请参见about_Jobs。
&后台操作符&
在PowerShell作业中先运行管道。“&”号背景运算符的行为类似于UNIX“&”号运算符,后者在运行命令之前先将其作为后台进程运行。“&”号背景运算符建立在PowerShell作业之上,因此它与共享许多功能
Start-Job
。以下命令包含“&”号背景运算符的基本用法。Get-Process -Name pwsh &
在功能上等效于的以下用法
Start-Job
。
Start-Job -ScriptBlock {Get-Process -Name pwsh}
由于在功能上等同于使用
Start-Job
,所以&符号背景运算符将Job
像返回一样Start-Job does
。这意味着您能够使用Receive-Job
,Remove-Job
就像您曾经Start-Job
开始工作一样。$job = Get-Process -Name pwsh & Receive-Job $job
输出量
NPM(K) PM(M) WS(M) CPU(s) Id SI ProcessName ------ ----- ----- ------ -- -- ----------- 0 0.00 221.16 25.90 6988 988 pwsh 0 0.00 140.12 29.87 14845 845 pwsh 0 0.00 85.51 0.91 19639 988 pwsh $job = Get-Process -Name pwsh & Remove-Job $job
有关PowerShell作业的更多信息,请参见about_Jobs。
Receive-Job 3
,但没有任何反应。
fg
带到* foreground一样获得它。
fg
在powershell中似乎没有与Unix类似的东西:(我记得在找它,但找不到任何东西
您可以使用PowerShell作业cmdlet实现目标。
在PowerShell中有6个与工作相关的cmdlet。
如果对此感兴趣,可以下载示例如何在PowerShell中创建后台作业
你可以做这样的事情。
$a = start-process -NoNewWindow powershell {timeout 10; 'done'} -PassThru
如果您想等待:
$a | wait-process
奖金osx或linux版本:
$a = start-process pwsh '-c',{start-sleep 5; 'done'} -PassThru
我有示例pinger脚本。args作为数组传递:
$1 = start -n powershell pinger,comp001 -pa
start
将派生该过程并将控制权返回给调用者。更多信息在这里
我已在PowerShell v1.0中成功使用了此处描述的解决方案http://jtruher.spaces.live.com/blog/cns!7143DA6E51A2628D!130.entry。在PowerShell v2.0中肯定会更容易。
Start-Job
当PS shell退出时,某些开头的内容将被杀死。相反,Start-Process
在PS shell退出后,似乎始于某种东西的东西将继续运行。这是一个主要区别。