Cómo usar Start-Process en PowerShell

Para ejecutar una aplicación, proceso o secuencia de comandos desde PowerShell, simplemente puede ingresar la ruta al archivo.

Pero esto iniciará el proceso en el mismo entorno y dentro del mismo contexto que su sesión de PowerShell.

Cuando desee ejecutar el proceso como un usuario diferente, iniciarlo en una nueva ventana o incluso iniciar varios procesos simultáneamente, deberá usar el cmdlet Start-Process.

En este artículo, vamos a echar un vistazo al cmdlet de proceso de inicio.

Cómo podemos ejecutar un proceso con permisos elevados, ejecutarlo en una nueva ventana o incluso completamente oculto.

También le daré un par de ejemplos útiles para comenzar.

Usando el proceso de inicio en PowerShell

El cmdlet Start-Process le permite ejecutar uno o varios procesos en su computadora desde PowerShell.

Está diseñado para ejecutar un proceso de forma asincrónica o para ejecutar una aplicación/secuencia de comandos elevada (con privilegios administrativos).

No necesita usar el cmdlet Start-Process si necesita ejecutar un script u otro programa de consola de forma sincrónica en PowerShell.

La razón de esto es que puede redirigir su salida a PowerShell.

Esta es una de las desventajas del cmdlet, no puede redirigir los flujos de salida o error a PowerShell. La única opción que tiene es redirigir la salida a archivos de texto.

Así que echemos un vistazo a cómo usar el cmdlet. Podemos utilizar los siguientes parámetros para iniciar un proceso:

Parámetro Descripción
-Ruta de archivo Especifique el archivo, la aplicación o el proceso para ejecutar
-Lista de argumentos Especifica parámetros para usar con el proceso para comenzar
-Credencial Cuenta de usuario para ejecutar el proceso con
-Directorio de trabajo La ubicación donde el proceso debe comenzar en
-NoNuevaVentana No abra una nueva ventana para el proceso
-Error estándar de redirección Especifique el archivo de texto para redirigir la salida de error a
-RedirectStandardInput Archivo de texto con entrada para el proceso
-RedirectStandardOutput Especifique el archivo de texto para redirigir la salida a
-Estilo de ventana Normal, Oculto, Minimizado o Maximizado
-Esperar Espere a que termine el proceso antes de continuar con el script
-UsarNuevoEntorno El proceso utilizará sus propias variables de entorno en lugar de las de la sesión de PowerShell
Parámetros de proceso de inicio

Entonces, para simplemente abrir una aplicación con PowerShell, podríamos usar el siguiente comando:

Start-Process Notepad.exe

# Simply typing notepad.exe in PowerShell will have the same result:
Notepad.exe

Esto abrirá el Bloc de notas en una nueva ventana con los mismos privilegios que la sesión de PowerShell.

El proceso se ejecuta de forma asincrónica, lo que significa que PowerShell continuará con el script, incluso si el proceso aún no ha finalizado.

Esperando a que termine un proceso

La espera más común para iniciar un proceso en PowerShell es esperar a que finalice.

Podemos usar el -wait parámetro para esto, lo que asegurará que PowerShell esperará hasta que el proceso y todos los procesos secundarios finalicen.

Digamos que tenemos un archivo bat que queremos iniciar desde PowerShell y esperamos a que termine el proceso:

# Start the process example.bat and wait for it to finish
Start-Process -FilePath "c:\temp\example.bat" -Wait
powershell de proceso de inicio
Proceso de inicio ejecutando Example.bat en una nueva ventana

Esto ejecutará el archivo bat y esperará a que finalice antes de continuar con el script o reanudar la entrada.

Tenga en cuenta que ningún resultado del proceso se captura de forma predeterminada. Por lo tanto, no sabrá si el archivo bat falló o se completó con éxito.

Tamaño de ventana y procesos ocultos

Si ejecutamos el archivo bat con el ejemplo anterior, ejecutará el archivo bat en una nueva ventana.

La ventana tendrá un tamaño normal y se cerrará cuando se complete el proceso.

En el cmdlet start-process, podemos especificar el tamaño de la ventana o incluso ocultarla por completo.

Podemos elegir entre utilizar los parámetros -WindowStyle y -NoNewWindow. Obviamente no podemos usar ambos parámetros juntos 😉

Para ejecutar el archivo bat sin ninguna ventana, podemos usar el siguiente comando en PowerShell:

# Start the process example.bat, without any window and wait for it to finish
Start-Process -FilePath "c:\temp\example.bat" -Wait -WindowStyle Hidden

No recibirá ningún comentario, excepto que su secuencia de comandos continuará cuando finalice el proceso.

Sin embargo, podemos redirigir el resultado del proceso a un archivo de texto, más sobre eso más adelante.

Para ejecutar un proceso en una ventana maximizada, normal o minimizada, puede utilizar las siguientes opciones:

# Default behavior:
Start-Process -FilePath "c:\temp\example.bat" -Wait -WindowStyle Normal

# Maximized
Start-Process -FilePath "c:\temp\example.bat" -Wait -WindowStyle Maximized

# Minimized
Start-Process -FilePath "c:\temp\example.bat" -Wait -WindowStyle Minimized

Otro parámetro que podemos usar es -NoNewWindow. Esto ejecutará el proceso en la misma ventana que el script de PowerShell. Esta opción solo funciona con procesos basados ​​en línea de comandos. Por ejemplo, no puede abrir el Bloc de notas en la misma ventana que PowerShell.

Start-Process -FilePath "c:\temp\example.bat" -Wait -NoNewWindow
iniciar la aplicación desde PowerShell
Ejecute example.bat en la misma ventana de PowerShell

Uso de argumentos con proceso de inicio

Algunos procesos o scripts que desea iniciar requieren parámetros (argumentos). Probablemente su primer pensamiento sea agregar los argumentos entre las comillas en la ruta del archivo, pero como habrá notado, eso no funcionará.

Para pasar argumentos al proceso que desea iniciar, deberá utilizar el -arguments parámetro.

Ejecutemos un MSI desde PowerShell como ejemplo. Para ejecutar el MSI en silencio, necesitaremos proporcionar los argumentos /quiet o /qn y probablemente tampoco queramos reiniciar, así que agregamos /norestart lo.

Start-Process -FilePath "C:\temp\example.msi" -Wait -ArgumentList "/quiet /norestart"

# Or arguments as string array:
Start-Process -FilePath "C:\temp\example.msi" -Wait -ArgumentList "/quiet","/norestart"

Proceso de inicio de PowerShell elevado

Cuando inicia un proceso con Start-Process, se ejecutará en el mismo contexto de usuario que la sesión de PowerShell.

Pero algunos procesos pueden necesitar permisos elevados para ejecutarse. Para hacer esto podemos usar el parámetro -Verb.

Tenga en cuenta que no puede combinar -Verb y -NoNewWindow porque el proceso que desea iniciar debe abrirse en una nueva ventana.

Para ejecutar el ejemplo.bat con permisos elevados podemos usar el siguiente comando:

Start-Process -FilePath "c:\temp\example.bat" -Wait -Verb RunAs

Dependiendo de la extensión del archivo, también son posibles otras opciones. Podríamos, por ejemplo, imprimir un archivo de texto con -Verb Print.

Iniciar proceso como un usuario diferente

También es posible ejecutar un proceso como un usuario diferente. De forma predeterminada, el proceso se ejecutará con las credenciales del usuario que ha iniciado sesión actualmente.

Primero, necesitará t para crear un objeto PSCredential y almacenarlo como una cadena segura. Luego puede pasar las credenciales al cmdlet con el parámetro -Credential.

Tenga en cuenta que las cadenas seguras no son muy seguras de usar, así que asegúrese de mantener la cadena segura lo más segura posible.

# Create credential object
# You can store these also in a text file
$username = Read-Host "Enter your username"
$secureStringPwd = Read-Host -assecurestring "Please enter your password"

# Create credential object
$credObject = New-Object System.Management.Automation.PSCredential -ArgumentList $username, $secureStringPwd

Start-Process -FilePath "c:\temp\example.bat" -Wait -Credentials $credObject

Redirigir la salida

La salida del cmdlet Start-Process no se puede pasar a PowerShell. La única opción que tenemos es redirigir la salida a un archivo de texto. Las variables no funcionarán.

Entonces, lo que puede hacer para capturar la salida es:

# Redirect the output to example-output.txt
Start-Process -FilePath "c:\temp\example.bat" -Wait -RedirectStandardOutput c:\temp\example-output.txt

# Read the contents of example-output.txt
$output = Get-Content c:\temp\example-output.txt

Lo que no funcionará es:

# Storing the output into a variable will throw an error
Start-Process -FilePath "c:\temp\example.bat" -Wait -RedirectStandardOutput $output

# $result will be empty
$result = Start-Process -FilePath "c:\temp\example.bat" -Wait

Si desea capturar solo el error del proceso, puede usar:

Start-Process -FilePath "c:\temp\example.bat" -Wait -RedirectStandardError c:\temp\example-output.txt

Obtener la ID del proceso

La última opción que quiero explicar es el parámetro -Passtru. Nos devolverá el objeto de proceso del proceso que hemos iniciado.

Esto puede ser útil cuando desea detener automáticamente un proceso cuando se ejecuta durante demasiado tiempo.

$process = Start-Process "C:\temp\example.bat" -PassThru

# Get the process ud
$process.ID

# Wait 1 second
Start-Sleep 1

# Kill the process
Stop-Process -id $process.Id

Terminando

El cmdlet Start-Process es excelente para ejecutar una o varias aplicaciones o scripts desde PowerShell.

Desafortunadamente, no podemos capturar fácilmente el resultado del proceso, pero con una pequeña solución alternativa, aún podemos inspeccionar los resultados en PowerShell.

Espero que este artículo le haya resultado útil, si tiene alguna pregunta, simplemente deje un comentario a continuación.

Otros artículos relacionados

Eliminar carpetas vacías en SharePoint Online

Eliminar carpetas vacías en SharePoint Online

Después de fusionar carpetas duplicadas en SharePoint Online, necesitaba eliminar las carpetas vacías. Esto es algo que también podemos hacer ...
Leer Más
Cómo usar Export-CSV en PowerShell

Cómo usar Export-CSV en PowerShell

Con PowerShell, puede extraer todo tipo de información de servicios como Active Directory o Microsoft 365. Pero a veces necesita ...
Leer Más
Cómo ejecutar un script de PowerShell

Cómo ejecutar un script de PowerShell

Los scripts de PowerShell son una excelente manera de automatizar tareas, recopilar información o modificar propiedades de forma masiva. La ...
Leer Más
Explicación del cliente PowerShell SSH y la comunicación remota

Explicación del cliente PowerShell SSH y la comunicación remota

¿Necesita administrar un servidor remoto o un dispositivo de red? Entonces probablemente esté usando SSH para conectarse y administrarlos. El ...
Leer Más
Uso de PowerShell para actualizar un usuario de AD desde un archivo CSV

Uso de PowerShell para actualizar un usuario de AD desde un archivo CSV

Necesitaba actualizar un grupo de usuarios de AD con sus nuevos títulos de trabajo. Ha comenzado un nuevo año y ...
Leer Más
Cómo agregar un usuario a un grupo en PowerShell con Add-ADGroupMember

Cómo agregar un usuario a un grupo en PowerShell con Add-ADGroupMember

Cuando necesite agregar varios usuarios a un grupo de Active Directory, usar PowerShell es realmente su mejor opción. En lugar ...
Leer Más

Deja un comentario