Cómo ejecutar un script de PowerShell desde la línea de comandos y más

Si eres nuevo en el lenguaje de secuencias de comandos PowerShell y deseas aprender a ejecutar scripts en PowerShell, has llegado al artículo adecuado. Este blog será un tutorial que abordará las formas comunes de ejecutar scripts y algunos problemas que pueden surgir.

Prerrequisitos

Este artículo será una guía paso a paso sobre cómo ejecutar PowerShell en tu computadora local. Si deseas seguir, asegúrate de tener los siguientes requisitos previos antes de comenzar este artículo.

  • A Windows 10 computer with Administrator privileges.
  • Windows PowerShell versión 5 o superior. También puedes utilizar PowerShell v7. Este tutorial se centrará en Windows PowerShell, ya que el sistema operativo Windows ya lo incluye.
  • Cualquier editor de archivos de texto

Manejo de la Política de Ejecución

Si es la primera vez que intentas ejecutar un script de Windows PowerShell, es probable que te encuentres con un problema común. PowerShell probablemente devolverá un mensaje de error indicando que un script “no se puede cargar porque la ejecución de scripts está deshabilitada en este sistema”.

PS> .\GetServices.ps1
 File C:\Temp\GetServices.ps1 cannot be loaded because running scripts is disabled on this system. For more information, see about_Execution_Policies at
 https:/go.microsoft.com/fwlink/?LinkID=135170.
 At line:1 char:1
 .\GetServices.ps1
 ~~~~~ CategoryInfo          : SecurityError: (:) [], PSSecurityException
 FullyQualifiedErrorId : UnauthorizedAccess   

PowerShell devuelve el mensaje de error mencionado anteriormente cuando intentas ejecutar un script de PowerShell con una política de ejecución establecida en Restringida, Firmada Remotamente o Todas Firmadas.

Restringida

Restringida es la política predeterminada establecida para las computadoras cliente de Windows. Si estás usando PowerShell por primera vez, es probable que tu política predeterminada esté configurada para restringir todos los scripts.

Todavía puedes ejecutar comandos individuales en un terminal, pero no un archivo de script. La restricción incluye cualquier archivo que termine con .ps1xml, .psm1 o .ps1.

Sin Restricciones

Sin Restricciones te permite ejecutar cualquier script, sin embargo, te advierte antes de la ejecución si el script se descargó de internet. Esta política suele ser la predeterminada para cualquier dispositivo no Windows.

Firmada Remotamente

La política Firmada Remotamente te permite ejecutar cualquier script que esté (a) firmado digitalmente o (b) cualquier script escrito en tu computadora local con o sin firma.

Si un script se descarga de internet y no está firmado, necesitarías desbloquear el archivo. Puedes hacerlo haciendo clic derecho en el archivo y seleccionando Propiedades. O puedes usar el cmdlet de PowerShell Unblock-File para ese archivo de script en particular.

Usar una política Firmada Remotamente sería una opción ideal al ejecutar un script descargado de internet.

Todas Firmadas

Todas Firmadas requiere que todos los scripts estén firmados digitalmente por un editor de confianza. Esto incluye los scripts descargados de internet y escritos localmente en tu computadora.

Cambiar la Política de Ejecución de PowerShell

Para cambiar la política de ejecución:

  1. Abre Windows PowerShell con Ejecutar como administrador para asegurarte de que tienes los permisos más altos para realizar los cambios de política.
Search PowerShell in Start Menu

2. Una vez abierto, ejecuta el siguiente comando de PowerShell para establecer la política de ejecución de tu computadora. La política de ejecución, como se mencionó anteriormente, puede ser uno de tres tipos diferentes. Este tutorial está utilizando una política de ejecución útil pero aún segura llamada RemoteSigned.

Dado que este tutorial asume que has descargado desde Internet el archivo de script GetServices.ps1, establece la política de ejecución en RemoteSigned.

PS> Set-ExecutionPolicy RemoteSigned

La política de ejecución RemoteSigned te obliga a firmar criptográficamente cada script de PowerShell descargado de Internet antes de que PowerShell lo ejecute en tu sistema.

3. Deberías ver una salida solicitando confirmar la acción. Ingresa Y y presiona enter para confirmar el cambio de política.

Execution Policy Change
 The execution policy helps protect you from scripts that you do not trust. Changing the execution policy might expose you to the
 security risks described in the about_Execution_Policies help topic at https:/go.microsoft.com/fwlink/?LinkID=135170. Do you want to
 change the execution policy?
 [Y] Yes  [A] Yes to All  [N] No  [L] No to All  [S] Suspend  [?] Help (default is "N"): 

En este punto, sigue los siguientes pasos para explorar diferentes métodos para ejecutar el script de PowerShell en tu computadora.

Cómo Ejecutar un Script de PowerShell

Para demostrar la ejecución de un script de PowerShell, ¡realmente necesitas un archivo de script para ejecutar! Si no tienes uno a mano, descarga este archivo ZIP y extrae el archivo PS1 dentro. Encontrarás dentro un archivo de script simple llamado GetServices.ps1.

Write-Output "Listing Computer Services"
Get-Service

Cada script de PowerShell debería terminar con la extensión .ps1.

Usando la Consola

Una vez que tengas un script listo, hay algunas formas diferentes de ejecutar un archivo de script de PowerShell. Una de las formas más comunes es a través de la consola de PowerShell.

Para hacerlo:

  1. Abre la consola de PowerShell como se muestra arriba.

2. Navega hasta la ubicación del sistema de archivos donde se encuentra tu script usando el cmdlet de PowerShell Set-Location o el alias cd. El script de este tutorial se encuentra en el directorio C:\Temp.

PS> cd C:\Temp\

3. Ejecuta el script usando la notación de punto (.). PowerShell es una shell que también busca nombres de comandos. Para diferenciar entre un comando de PowerShell y un script, debes anteponer el script con un punto. Este punto representa el directorio actual.

 PS> .\GetServices.ps1

Cómo Ejecutar un Script de PowerShell desde la Línea de Comandos a través de la Ubicación de PowerShell

Si no puedes o prefieres no ejecutar scripts a través de la consola de PowerShell, también puedes hacerlo con el buen y viejo símbolo del sistema (command prompt).

Para ejecutar scripts a través del símbolo del sistema, primero debes iniciar el ejecutable de PowerShell (`powershell.exe`), con la ubicación de PowerShell en `C:\Program Files\WindowsPowerShell\powershell.exe` y luego pasar la ruta del script como parámetro.

Puedes ejecutar scripts con parámetros en cualquier contexto simplemente especificándolos mientras ejecutas el ejecutable de PowerShell como `powershell.exe -Parameter ‘Foo’ -Parameter2 ‘Bar’`.

Una vez que abras `cmd.exe`, puedes ejecutar un script de PowerShell como se muestra a continuación. Este ejemplo está ejecutando el motor y pasándole la ruta del script `C:\Temp\GetServices.ps1`.

Observa que el ejemplo está utilizando la ubicación de PowerShell para ejecutar el script. Deberás hacer esto si la carpeta no está en tu PATH en algún lugar.

CMD> C:\Program Files\WindowsPowerShell\powershell.exe "C:\Temp\GetServices.ps1"

La ubicación de PowerShell para PowerShell 7 utiliza un ejecutable diferente llamado `pwsh.exe`, generalmente ubicado en `C:\Program Files\PowerShell\7\pwsh.exe`.

A continuación hay un práctico video de YouTube que cubre la ejecución de un script a través de un archivo por lotes que `cmd.exe` ejecuta.

Usando el ISE de PowerShell

Si creas tus propios scripts o editas los de otros, probablemente estés usando un editor de scripts como el ISE de PowerShell o tal vez Visual Studio (VS) Code. Dado que el ISE viene con Windows, vamos a enfocarnos en ese método para este tutorial.

Para invocar un script a través del ISE:

  1. Dirígete al Menú de Inicio, busca PowerShell ISE y ábrelo.
Search PowerShell ISE in Start Menu

2. Haz clic en ArchivoAbrir y encuentra tu script.

Open Script using File Menu

3. Con el script abierto, haz clic en el botón verde de ejecución para ejecutarlo. Este botón invocará el script en la terminal de PowerShell integrada en la parte inferior.

Run Script using PowerShell ISE

La Salida del Ejemplo del Script

A PowerShell script can sometimes return output. This happens when the script you’re executing is built to return objects which is a fundamental component of PowerShell.

Si ejecutas el script de ejemplo GetServices.ps1, verás lo siguiente. Este script ejecuta el cmdlet Get-Service que devuelve todos los servicios instalados en tu computadora Windows local.

PS> .\GetScripts.ps1
Listing Computer Services
Status   Name               DisplayName
------   ----               -----------
Running  aakore             Acronis Agent Core Service
Stopped  AarSvc_1b668d      Agent Activation Runtime_1b668d
Running  AcronisActivePr... Acronis Active Protection Service
Running  AcronisCyberPro... Acronis Cyber Protection Service
Running  AcrSch2Svc         Acronis Scheduler2 Service
Running  AdobeARMservice    Adobe Acrobat Update Service
Running  AdobeUpdateService AdobeUpdateService
Running  AGMService         Adobe Genuine Monitor Service
Running  AGSService         Adobe Genuine Software Integrity Se...
----Truncated----

Ejecutando un Script de PowerShell desde Dentro de Otro Script

Supongamos que tienes dos scripts y quieres que uno llame al otro. Tal vez tengas un script llamado GetUser.ps1 y otro llamado ResetPassword.ps1. Dentro del script GetUser.ps1, quieres ejecutar el ResetPassword.ps1 para restablecer la contraseña de un usuario.

Dentro del script llamante (GetUser.ps1), agregarías una línea para ejecutar el otro script de la misma manera que llamarías al script desde la línea de comandos.

Puedes ver abajo que tienes un par de opciones. Normalmente deberías elegir ejecutar el otro script dentro de la misma sesión o alcance para simplificar las cosas a menos que tengas una razón específica para ejecutar el script en otra sesión de PowerShell.

## Para ejecutar el otro script en una nueva sesión
powershell.exe .\ResetPassword.ps1
## Para ejecutar el otro script en la misma sesión
.\ResetPassword.ps1

Source:
https://adamtheautomator.com/run-powershell-script/