Espere a que termine cada comando en PowerShell
-
Uso de los comandos
Out
para esperar a que finalice cada comando en PowerShell -
Uso del cmdlet
Start-Process
para esperar a que finalice cada comando en PowerShell - Uso de trabajos en segundo plano para esperar a que finalice cada comando en PowerShell
-
Uso del cmdlet
Wait-Process
para esperar a que finalice cada comando en PowerShell -
Uso de la clase
[Diagnostics.Process]
para esperar a que finalice 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
-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 specializes in anything Microsoft-related and always tries to work and apply code in an IT infrastructure.
LinkedIn