我有一个PowerShell 1.0脚本来打开一堆应用程序。第一个是虚拟机,其他是开发应用程序。我希望虚拟机在打开其余应用程序之前完成引导。
在bash中,我可以输入cmd1 && cmd2
这就是我得到的…
C:\Applications\VirtualBox\vboxmanage startvm superdooper
&"C:\Applications\NetBeans 6.5\bin\netbeans.exe"
我有一个PowerShell 1.0脚本来打开一堆应用程序。第一个是虚拟机,其他是开发应用程序。我希望虚拟机在打开其余应用程序之前完成引导。
在bash中,我可以输入cmd1 && cmd2
这就是我得到的…
C:\Applications\VirtualBox\vboxmanage startvm superdooper
&"C:\Applications\NetBeans 6.5\bin\netbeans.exe"
当前回答
更进一步说,您甚至可以在运行中进行解析
e.g.
& "my.exe" | %{
if ($_ -match 'OK')
{ Write-Host $_ -f Green }
else if ($_ -match 'FAIL|ERROR')
{ Write-Host $_ -f Red }
else
{ Write-Host $_ }
}
其他回答
通常,对于内部命令,PowerShell在启动下一个命令之前会等待。这个规则的一个例外是基于外部Windows子系统的EXE。第一个技巧是管道到Out-Null,就像这样:
Notepad.exe | Out-Null
PowerShell将等待Notepad.exe进程退出后再继续。这很漂亮,但从阅读代码中获得的感觉有点微妙。你也可以使用Start-Process和-Wait参数:
Start-Process <path to exe> -NoNewWindow -Wait
如果你使用的是PowerShell社区扩展版本,它是:
$proc = Start-Process <path to exe> -NoNewWindow -PassThru
$proc.WaitForExit()
PowerShell 2.0中的另一个选项是使用后台作业:
$job = Start-Job { invoke command here }
Wait-Job $job
Receive-Job $job
总是有cmd。
cmd /c start /wait notepad
Or
notepad | out-host
更进一步说,您甚至可以在运行中进行解析
e.g.
& "my.exe" | %{
if ($_ -match 'OK')
{ Write-Host $_ -f Green }
else if ($_ -match 'FAIL|ERROR')
{ Write-Host $_ -f Red }
else
{ Write-Host $_ }
}
包括选项-NoNewWindow会给我一个错误:Start-Process:由于错误:访问被拒绝,这个命令不能执行。
我能让它工作的唯一方法就是打电话:
Start-Process <path to exe> -Wait
如果使用Start-Process <path来exe> -NoNewWindow -Wait . exe
您还可以使用-PassThru选项来回显输出。