Compartir a través de


Ejecución de comandos en el shell

PowerShell es un shell de línea de comandos y un lenguaje de scripting que se usa para la automatización. De forma similar a otros shells, como bash en Linux o windows Command Shell (cmd.exe), PowerShell le permite ejecutar cualquier comando disponible en el sistema, no solo comandos de PowerShell.

Tipos de comandos

Para cualquier shell de cualquier sistema operativo hay tres tipos de comandos:

  • Las palabras clave del lenguaje del shell forman parte del lenguaje de scripting del shell.

    • Algunos ejemplos de palabras clave de bash son: if, then, else, elify fi.
    • Algunos ejemplos de palabras clave de cmd.exe son: dir, copy, move, ify echo.
    • Algunos ejemplos de palabras clave de PowerShell son: for, foreach, try, catchy trap.

    Las palabras clave del lenguaje shell solo se pueden usar en el entorno en tiempo de ejecución del shell. No hay ningún archivo ejecutable, externo al shell, que proporciona la funcionalidad de la palabra clave.

  • comandos nativos del sistema operativo son archivos ejecutables instalados en el sistema operativo. Los ejecutables se pueden ejecutar desde cualquier shell de línea de comandos, como PowerShell. Esto incluye archivos de script que pueden requerir que otros shells funcionen correctamente. Por ejemplo, si ejecuta un archivo de script por lotes de Windows (.cmd) en PowerShell, PowerShell ejecuta cmd.exe y transmite el archivo de script por lotes para su ejecución.

  • comandos específicos del entorno de Shell son comandos definidos en archivos externos que solo se pueden usar en el entorno en tiempo de ejecución del shell. Estos incluyen scripts y funciones, o pueden ser módulos especialmente compilados que agregan comandos al entorno de ejecución del shell. En PowerShell, estos comandos se conocen como cmdlets (pronunciado "command-lets").

Ejecución de comandos nativos

Cualquier comando nativo se puede ejecutar desde la línea de comandos de PowerShell. Normalmente, ejecuta el comando exactamente como lo haría en bash o cmd.exe. En el ejemplo siguiente se muestra cómo ejecutar el comando grep en bash en Ubuntu Linux.

sdwheeler@circumflex:~$ grep sdwheeler /etc/passwd
sdwheeler:x:1000:1000:,,,:/home/sdwheeler:/bin/bash
sdwheeler@circumflex:~$ pwsh
PowerShell 7.2.6
Copyright (c) Microsoft Corporation.

https://aka.ms/powershell
Type 'help' to get help.

Después de iniciar PowerShell en Ubuntu, puede ejecutar el mismo comando desde la línea de comandos de PowerShell:

PS /home/sdwheeler> grep sdwheeler /etc/passwd
sdwheeler:x:1000:1000:,,,:/home/sdwheeler:/bin/bash

Pasar argumentos a comandos nativos

La mayoría de los shells incluyen características para usar variables, evaluar expresiones y controlar cadenas. Pero cada shell hace estas cosas de manera distinta. En PowerShell, todos los parámetros comienzan con un carácter de guion (-). En cmd.exe, la mayoría de los parámetros usan un carácter de barra diagonal (/). Es posible que otras herramientas de línea de comandos no tengan un carácter especial para los parámetros.

Cada shell tiene su propia manera de controlar y evaluar cadenas en la línea de comandos. Al ejecutar comandos nativos en PowerShell que esperan que las cadenas estén entrecomilladas de forma específica, es posible que necesite ajustar cómo se pasan esas cadenas.

Para obtener más información, consulte los artículos siguientes:

PowerShell 7.2 introdujo una nueva característica experimental PSNativeCommandArgumentPassing que mejoró el control de comandos nativos. Para obtener más información, consulte $PSNativeCommandArgumentPassing.

Control de la salida y los errores

PowerShell también tiene varios flujos de salida más que otros shells. Los shells bash y cmd.exe tienen stdout y stderr. PowerShell tiene seis flujos de salida. Para obtener más información, vea about_Redirection y about_Output_Streams.

En general, la salida enviada a stdout por un comando nativo se envía a la secuencia Success en PowerShell. La salida enviada a stderr por un comando nativo se envía a la secuencia Erroren PowerShell.

Cuando un comando nativo tiene un código de salida distinto de cero, $? se establece en $false. Si el código de salida es cero, $? se establece en $true.

Sin embargo, esto cambió en PowerShell 7.2. Los registros de error redirigidos desde comandos nativos, como cuando se usan operadores de redireccionamiento (2>&1), no se escriben en la variable $Error de PowerShell y la variable de preferencia $ErrorActionPreference no afecta a la salida redirigida.

Muchos comandos nativos escriben en stderr a modo de flujo alternativo para obtener información adicional. Este comportamiento puede causar confusión en PowerShell al revisar los errores y se pierde la información de salida adicional si $ErrorActionPreference está establecido en un estado que muta la salida.

PowerShell 7.3 ha agregado una nueva característica experimental PSNativeCommandErrorActionPreference que permite controlar si la salida a stderr se trata como un error. Para obtener más información, consulte $PSNativeCommandUseErrorActionPreference.

Ejecución de comandos de PowerShell

Como se indicó anteriormente, los comandos de PowerShell se conocen como cmdlets. Los cmdlets se recopilan en módulos de PowerShell que se pueden cargar a petición. Los cmdlets se pueden escribir en cualquier lenguaje .NET compilado o mediante el propio lenguaje de scripting de PowerShell.

Comandos de PowerShell que ejecutan otros comandos

El operador de llamada de PowerShell (&) permite ejecutar comandos almacenados en variables y representados por cadenas o bloques de script. Puede usarlo para ejecutar cualquier comando nativo o comando de PowerShell. Esto es útil en un script cuando necesita construir dinámicamente los parámetros de la línea de comandos para un comando nativo. Para obtener más información, vea el operador de llamada.

El cmdlet Start-Process se puede usar para ejecutar comandos nativos, pero solo debe usarse cuando necesite controlar cómo se ejecuta el comando. El cmdlet tiene parámetros para admitir los siguientes escenarios:

  • Ejecución de un comando con credenciales diferentes
  • Ocultar la ventana de consola creada por el nuevo proceso
  • Redirección de los flujos stdin, stdout y stderr
  • Uso de un directorio de trabajo diferente para el comando

En el ejemplo siguiente se ejecuta el comando nativo sort.exe con flujos de entrada y salida redirigidos.

$processOptions = @{
    FilePath = "sort.exe"
    RedirectStandardInput = "TestSort.txt"
    RedirectStandardOutput = "Sorted.txt"
    RedirectStandardError = "SortError.txt"
    UseNewEnvironment = $true
}
Start-Process @processOptions

Para obtener más información, vea Start-Process.

En Windows, el cmdlet Invoke-Item realiza la acción predeterminada para el elemento especificado. Por ejemplo, ejecuta un archivo ejecutable o abre un archivo de documento mediante la aplicación asociada al tipo de archivo de documento. La acción predeterminada depende del tipo de elemento y se resuelve mediante el proveedor de PowerShell que proporciona acceso al elemento.

En el ejemplo siguiente se abre el repositorio de código fuente de PowerShell en el explorador web predeterminado.

Invoke-Item https://github.com/PowerShell/PowerShell

Para obtener más información, vea Invoke-Item.