Aunque no es recomendable usar servicios externos en PowerShell, a veces no tienes elección. Por supuesto, siempre es una buena idea asegurarse primero de que PowerShell no pueda realizar nativamente la tarea que usted tiene, ya que esto elimina las dependencias y hace que sus scripts sean fácilmente transportables. Aún así, los tiempos desesperados requieren otras medidas. Afortunadamente, PowerShell ofrece algunas formas diferentes de ejecutar procesos externos que le permiten controlar mejor su ejecución. Cubramos algunos de estos métodos.
El ampersand
Usar un simple ampersand es de lejos la forma más fácil de iniciar la ejecución de un proceso EXE. Esto es similar al archivo batch, en que simplemente pones en marcha el EXE y dejas que haga lo suyo. Para iniciar el notepad.exe, por ejemplo, solo necesitas crear un script y agregar un ampersand antes de la ruta al EXE:
& C:N- Sistema de Ventanas32
otepad.exe
Esto funciona, pero la desventaja es que no tienes control sobre la salida. Estás a merced de lo que el EXE quiera comportarse. Los buenos guiones controlan cada pieza posible. Esta no es la forma recomendada para iniciar un proceso externo.
Usando WMI con el método CreateProcess()
Otra forma de iniciar un proceso externo es usando el método CreateProcess()en la clase Win32_Process WMI. Antes de remover el PS, esta era una gran manera de iniciar un proceso en una computadora remota (aunque también se podía hacer fácilmente en una computadora local). Para ejecutar un proceso de esta manera necesitarías invocar el método CreateProcess()y usar el nombre EXE como parámetro. Una forma de invocar los métodos WMI es a través del cmdlet Invoke-WmiMethod. Este cmdlet proporciona un parámetro Class, el nombre del método que quieres invocar y, finalmente, un parámetro ArgumentList en el que puedes pasar el nombre del EXE:
Invoke-WmiMethod -Class Win32_Process -Name Create -ArgumentList $0027notepad.exe$0027
Puede ver que esto proporciona información útil como el ReturnValue. Usando el valor de retorno, podría tener algo de lógica en mi script para asegurar que el proceso se complete con éxito (típicamente con un código de retorno 0) o no, y luego tomar decisiones basadas en eso.
Proceso de arranque
El proceso de inicio es probablemente la forma más común de invocar procesos externos en PowerShell. Start-Process provee mucha funcionalidad incorporada, como obtener el valor de retorno como el método CreateProcess(). Sin embargo, también puede almacenar la salida que el proceso genera como stdout y stderr en un archivo para que pueda leer estos archivos con código y realizar más tareas en la salida. Start-Process también puede controlar las ventanas. Digamos que tienes una instalación de software que aparece una caja molesta mientras se está instalando. Con Start-Process puedes ocultar esta ventana al usuario. También le da la opción de ocultar la ventana cmd.exe que típicamente aparece cuando se ejecuta un proceso externo en PowerShell. En su forma más básica, puede iniciar ipconfig.exe simplemente usando el parámetro FilePath:
Start-Process -FilePath C:NWindowsN-System32Nipconfig.exe
Sin embargo, notarías que una ventana de cmd.exe aparece. Me gustaría ocultar eso:
Start-Process -FilePath C:WindowsSystem32ipconfig.exe -NoNewWindow
Luego pone la salida estándar directamente en la sesión de PowerShell.
Otro truco genial con Start-Process es redirigir la salida a un archivo. Simplemente usa el parámetro RedirectStandardOutput.
Lo más probable es que el proceso de inicio se aplique a casi todas las veces que necesite ejecutar procesos externos en PowerShell. Sin embargo, si necesita un control aún mayor, también puede sumergirse en el .NET y jugar con la clase de Proceso. Usar .NET le da el mayor control pero también es el más complicado.
Como puedes ver, hay diferentes maneras de generar procesos externos en PowerShell. Dependiendo del contexto, puede que te encuentres usando cada una de ellas en ocasiones. Siempre asegúrese de entender todas sus opciones para que pueda hacer la mejor elección.