Cuando ejecuta un comando o inicia un proceso desde PowerShell, a menudo desea esperar a que finalice el comando o proceso antes de que el script continúe. La opción más sencilla para esto es utilizar el parámetro -Wait del cmdlet Start-Process, pero también existen otras opciones.
En este artículo, veremos cómo usar el parámetro -Wait, usar el cmdlet Wait-Process y también le mostraré algunas otras opciones.
Espere en PowerShell
Podemos utilizar PowerShell para todo tipo de tareas, incluido iniciar un programa o ejecutar otro comando. Pero el "problema" con PowerShell es que, de forma predeterminada, no espera a que finalice el programa o comando.
Simplemente intentará iniciar el programa o ejecutar el comando y, si tiene éxito, continuará con la siguiente parte del script. Ahora, en algunas situaciones, querrás que PowerShell espere antes de continuar. Para ello, tenemos un par de opciones:
- -Esperar parámetropara el cmdlet Inicio-Proceso
- Proceso de espera
- Inicio-Dormir
Iniciar proceso con -Esperar
Cuando desee ejecutar un programa o comando desde PowerShell, puede utilizar elStart-Processcmdlet. Echemos un vistazo a un ejemplo, abriremos un archivo de texto en el Bloc de notas y esperaremos a que el usuario cierre el archivo antes de continuar con el script:
# Open File1.txt in the default editor (notepad) Start-Process -FilePath "C:\temp\File1.txt" -Wait # Notepad is closed, get the content of the file Get-Content -path "C:\temp\File1.txt"
Si ejecuta el código anterior en PowerShell, verá que se abrirá el Bloc de notas, lo que le permitirá escribir contenido en el archivo y, después de cerrarlo, el contenido del archivo se mostrará en la consola.

Proceso de espera
Otra opción es utilizar elWait-Processcmdlet. Este cmdlet espera a que se cierren uno o más procesos antes de permitir que PowerShell continúe. Es importante tener en cuenta que el cmdlet Wait-Process no funciona en Linux o macOS.
Para comprobar si un proceso está cerrado, primero necesitamos saber el nombre del proceso o el ID del proceso. Otra opción es utilizar un objeto de proceso, que podemos obtener por ejemplo con elGet-ProcessoStart-Processcmdlet.
Si conoce el nombre del proceso y el nombre es único, simplemente puede usar el-nameparámetro a obtener y esperar a que finalice el proceso:
Wait-Process Name "Notepad"
Otra opción es buscar primero el proceso, utilizando elGet-Processcmdlet. Este cmdlet enumerará todos los procesos en ejecución, pero también podemos filtrar los procesos por nombre usando el-nameparámetro. Es bueno saber que podemos usar comodines en el nombre:
$proc = Get-Process -Name "Notepad" Wait-Proces -Id $proc.id
También podemos combinar Start-Process y Wait-Process. Para hacer esto, necesitaremos usar el-PassThruparámetro para el cmdlet Start-Process para que devuelva el objeto de proceso.
Esto nos permite hacer esto mientras el proceso se está ejecutando, pero verificar más adelante en el script si el proceso finalizó antes de continuar con la última parte:
# Start the process $process = Start-Process -FilePath "notepad.exe" -ArgumentList "C:\temp\File1.txt" -PassThru # Do something in between Write-Output "Process $($process.Id) is running." # Wait untill process is finished Wait-Process -Id $process.Id Write-Output "Process has finished."
Inicio-Dormir
El último método que podría utilizar para esperar si un proceso finaliza en PowerShell es el. Este cmdlet no puede verificar si un proceso se está ejecutando o no, pero solo permite que PowerShell espere un período x de tiempo.
Esto puede resultar bastante útil si, por ejemplo, sabe que un proceso siempre necesita un par de segundos para ponerse en marcha o finalizar.
ElStart-SleepEl cmdlet funciona especificando cuánto tiempo, en segundos o milisegundos, debe esperar PowerShell.
Por ejemplo, para dejar que PowerShell espere 5 segundos, podemos usar:
# Wait for 5 seconds before continuing Start-Sleep -Seconds 5
Esperar entrada
Otro método que también quiero mostrarles es esperar la entrada en PowerShell. A veces es más fácil dejar que PowerShell espere a que se presione una tecla antes de continuar. Puede ser cualquier entrada clave o una clave específica si lo desea. Tenemos dos opciones para esperar la entrada, podemos usar elReadKeymétodo de laSystem.Console .Netclase o podemos usar elRead-Host method.
El método ReadKey siguiente no devolverá ningún resultado en la consola (excepto el host de escritura, por supuesto), pero no funciona en PowerShell ISE (pero yode todos modos..)
Write-Host "Press any key to continue..."
$Host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown") | Out-NullCon Read-Host, sin embargo, podemos especificar qué tecla debe presionar el usuario. Esto le da un poco más de control sobre cuándo continuar con el guión. En el siguiente ejemplo, combinamos un bucle While con el cmdlet Read-Host, por lo que seguirá solicitando presionar el botónYclave antes de que PowerShell continúe.
while ((Read-Host "Press 'Y' to continue") -ne 'Y') {}Concluyendo
Al iniciar el proceso o comando desde PowerShell, es mejor usar el cmdlet Start-Process combinado con el parámetro -Wait. Si el proceso ya se está ejecutando, entonces el cmdlet Wait-Process es la mejor opción a utilizar.
Espero que te haya gustado este artículo, si tienes alguna pregunta, deja un comentario a continuación.













![[Resuelto] ¿Dónde van los archivos y fotos de AirDrop en iPhone/Mac?](https://elsefix.com/statics/image/placeholder.png)

