todos - script powershell ejemplos
¿Cómo decirle a PowerShell que espere a que termine cada comando antes de comenzar el siguiente? (7)
Tengo un script de PowerShell 1.0 para simplemente abrir un montón de aplicaciones. La primera es una máquina virtual y las otras son aplicaciones de desarrollo. Quiero que la máquina virtual termine de arrancar antes de que se abra el resto de las aplicaciones.
En bash, podría decir "cmd1 && cmd2"
Esto es lo que tengo ...
C:/Applications/VirtualBox/vboxmanage startvm superdooper
&"C:/Applications/NetBeans 6.5/bin/netbeans.exe"
Además de usar Start-Process -Wait
, conectar la salida de un ejecutable hará que Powershell espere. Dependiendo de la necesidad, normalmente conectaré a Out-Null
, Out-Default
, Out-String
o Out-String -Stream
. Here hay una larga lista de algunas otras opciones de salida.
# Saving output as a string to a variable.
$output = ping.exe example.com | Out-String
# Filtering the output.
ping .com | where { $_ -match ''^reply'' }
# Using Start-Process affords the most control.
Start-Process -Wait SomeExecutable.com
Extraño los operadores de estilo CMD / Bash a los que hizo referencia (&, &&, ||). Parece que tenemos que ser más prolijo con Powershell .
Algunos programas no pueden procesar la secuencia de salida muy bien, el uso de la tubería a Out-Null
puede no bloquearlo.
Y Start-Process
necesita el -ArgumentList
para pasar argumentos, no tan conveniente.
También hay otro enfoque.
$exitCode = [Diagnostics.Process]::Start(<process>,<arguments>).WaitForExit(<timeout>)
Incluir la opción -NoNewWindow
me da un error: Start-Process : This command cannot be executed due to the error: Access is denied.
La única forma en que podía hacer que funcionara era llamar:
Start-Process <path to exe> -Wait
Normalmente, para los comandos internos, PowerShell espera antes de comenzar el siguiente comando. Una excepción a esta regla es EXE externo basado en subsistema de Windows. El primer truco es canalizar a Out-Null
así:
Notepad.exe | Out-Null
PowerShell esperará hasta que se haya cerrado el proceso Notepad.exe antes de continuar. Eso es ingenioso pero algo sutil a la hora de leer el código. También puede usar Start-Process con el parámetro -Wait:
Start-Process <path to exe> -NoNewWindow -Wait
Si está utilizando la versión de PowerShell Community Extensions, es:
$proc = Start-Process <path to exe> -NoWindow
$proc.WaitForExit()
Otra opción en PowerShell 2.0 es usar un trabajo de fondo:
$job = Start-Job { invoke command here }
Wait-Job $job
Receive-Job $job
Si lo llevas más lejos, podrías incluso analizarlo sobre la marcha
p.ej
& "my.exe" | %{
if ($_ -match ''OK'')
{ Write-Host $_ -f Green }
else if ($_ -match ''FAIL|ERROR'')
{ Write-Host $_ -f Red }
else
{ Write-Host $_ }
}
Si usa Start-Process <path to exe> -NoNewWindow -Wait
También puede usar la opción -PassThru
para emitir eco.
Solo usa "Wait-process":
"notepad","calc","wmplayer" | ForEach-Object {Start-Process $_} | Wait-Process ;dir
el trabajo esta terminado