Espere a que termine cada comando en PowerShell

  1. Uso de los comandos Out para esperar a que finalice cada comando en PowerShell
  2. Uso del cmdlet Start-Process para esperar a que finalice cada comando en PowerShell
  3. Uso de trabajos en segundo plano para esperar a que finalice cada comando en PowerShell
  4. Uso del cmdlet Wait-Process para esperar a que finalice cada comando en PowerShell
  5. Uso de la clase [Diagnostics.Process] para esperar a que finalice cada comando en PowerShell
Espere a que termine cada comando en PowerShell

Por lo general, Windows PowerShell espera los comandos internos antes de iniciar el siguiente comando.

Una excepción a esta regla es el EXE externo basado en el subsistema de Windows. Además, Windows PowerShell no espera a que finalicen los comandos cuando se ejecutan programas ejecutables.

Este artículo le mostrará formas de obligar al entorno de Windows PowerShell a esperar a que finalicen los comandos con archivos ejecutables antes de pasar al siguiente comando.

Uso de los comandos Out para esperar a que finalice cada comando en PowerShell

Como se mencionó, ejecutar un archivo ejecutable no esperará a que finalice el comando y irá directamente al siguiente comando. Es posible que debamos evitar esto, especialmente si creamos un script que debe ejecutar aplicaciones secuencialmente.

Un truco ingenioso es usar uno de los comandos Out como Out-Null. Al ejecutar una aplicación, canalizar el cmdlet Out-Null engañará a Windows PowerShell para que ejecute un cmdlet subyacente sobre la aplicación en ejecución.

Recuerde que el cmdlet Out-Null no muestra nada en la consola y, por lo tanto, parece una aplicación estándar en ejecución. La única diferencia es que espera a que se ejecute toda la línea de comandos.

Código de ejemplo:

Notepad.exe | Out-Null

Otros ejemplos de comandos Out que podemos utilizar son los siguientes:

  • Out-Default: envía la salida al entorno de formato predeterminado y al cmdlet de salida predeterminado.
  • Out-File: envía la salida a un archivo.
  • Out-GridView: envía la salida a una tabla interactiva en una ventana separada.
  • Out-Host - Envía la salida a la línea de comando.
  • Out-Printer: envía la salida a una impresora.
  • Out-String: envía objetos al host como una serie de cadenas.

Uso del cmdlet Start-Process para esperar a que finalice cada comando en PowerShell

Otro método para hacer que Windows PowerShell espere a que termine la línea de comando es el cmdlet Start-Process.

Por ejemplo, podemos usar el parámetro -Wait del cmdlet Start-Process, y Windows PowerShell esperará a que finalice el proceso antes de ejecutar la siguiente línea de comando.

Start-Process notepad.exe -NoNewWindow -Wait
Nota
El parámetro -NoNewWindow en el ejemplo anterior iniciará el proceso actual sin abrir una nueva ventana de consola.

Al usar las versiones de extensión de la comunidad de PowerShell, primero se crea un nuevo objeto. Una vez creado el objeto, se llama a la función WaitForExit().

$proc = Start-Process notepad.exe -NoNewWindow -PassThru
$proc.WaitForExit()

Uso de trabajos en segundo plano para esperar a que finalice cada comando en PowerShell

Otro método para hacer que Windows PowerShell espere a que finalice la línea de comando es usar un trabajo en segundo plano.

Un trabajo en segundo plano es un comando o un conjunto de comandos que se ejecutan en un proceso separado en la máquina local. A continuación se muestra un ejemplo de sintaxis de un trabajo en segundo plano.

$job = Start-Job { notepad.exe }
Wait-Job $job
Receive-Job $job

Llamar al cmdlet Wait-Job hará que el proceso espere hasta que se llame a Receive-Job en la línea de comando.

Uso del cmdlet Wait-Process para esperar a que finalice cada comando en PowerShell

Otro método para hacer que Windows PowerShell espere a que termine la línea de comandos es el cmdlet Wait-Process.

Al igual que nuestro primer ejemplo, podemos canalizar esto en nuestro archivo ejecutable y esperar a que finalice la línea de comando. Sin embargo, el uso de este cmdlet solo funciona en Windows PowerShell versiones 5.1 e inferiores y no funcionará con la versión más reciente de PowerShell (Core) 7.

Notepad.exe | Wait-Process

Uso de la clase [Diagnostics.Process] para esperar a que finalice cada comando en PowerShell

Si tiene una biblioteca .NET instalada en su sistema, puede usar la clase [Diagnostics.Process] para esperar a que finalicen sus procesos antes de pasar a la siguiente línea de comando.

Sin embargo, no recomendamos usar esto ya que hay otros cmdlets más simples disponibles dentro de Windows PowerShell que podemos utilizar por completo. Solo use bibliotecas .NET si los comandos de PowerShell no están disponibles.

[Diagnostics.Process]::Start('notepad.exe').WaitForExit()
Marion Paul Kenneth Mendoza avatar Marion Paul Kenneth Mendoza avatar

Marion specializes in anything Microsoft-related and always tries to work and apply code in an IT infrastructure.

LinkedIn