我有一个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"
当前回答
有些程序不能很好地处理输出流,使用管道Out-Null可能不会阻塞它。 Start-Process需要-ArgumentList开关来传递参数,不太方便。 还有另一种方法。
$exitCode = [Diagnostics.Process]::Start(<process>,<arguments>).WaitForExit(<timeout>)
其他回答
有些程序不能很好地处理输出流,使用管道Out-Null可能不会阻塞它。 Start-Process需要-ArgumentList开关来传递参数,不太方便。 还有另一种方法。
$exitCode = [Diagnostics.Process]::Start(<process>,<arguments>).WaitForExit(<timeout>)
除了使用Start-Process -Wait,通过管道输出可执行文件也会使Powershell等待。根据需要,我通常会管道到Out-Null, Out-Default, Out-String或Out-String -Stream。下面是一些其他输出选项的长列表。
# Saving output as a string to a variable.
$output = ping.exe example.com | Out-String
# Filtering the output.
ping stackoverflow.com | where { $_ -match '^reply' }
# Using Start-Process affords the most control.
Start-Process -Wait SomeExecutable.com
我确实想念你引用的CMD/Bash样式操作符(&,&&,||)。它 似乎我们必须更详细的Powershell。
包括选项-NoNewWindow会给我一个错误:Start-Process:由于错误:访问被拒绝,这个命令不能执行。
我能让它工作的唯一方法就是打电话:
Start-Process <path to exe> -Wait
这个问题很久以前就提出了,但由于这里的答案是参考,我可能会提到一个最新的用法。在PowerShell的当前实现中(编写时它是7.2 LTS),您可以像在Bash中那样使用&&。
根据左边管道的成功,有条件地执行右边管道。 #如果Get-Process成功找到一个名为notepad的进程, # Stop-Process -Name记事本被调用 获取进程记事本&&停止进程-Name记事本
关于文档的进一步信息
更进一步说,您甚至可以在运行中进行解析
e.g.
& "my.exe" | %{
if ($_ -match 'OK')
{ Write-Host $_ -f Green }
else if ($_ -match 'FAIL|ERROR')
{ Write-Host $_ -f Red }
else
{ Write-Host $_ }
}