Introducción al scripting

Completado

El scripting de PowerShell es el proceso de escribir un conjunto de instrucciones en el lenguaje de PowerShell y almacenar dichas instrucciones en un archivo de texto. ¿Y por qué debería hacer esto? Después de usar PowerShell durante un tiempo, descubrirá que repite ciertas tareas, como la generación de informes de registro o la administración de usuarios. Cuando haya repetido algo con frecuencia, probablemente sea buena idea automatizarlo, es decir, almacenarlo de tal manera que sea fácil de reutilizar.

Los pasos para automatizar una tarea suelen incluir llamadas a cmdlets, funciones, variables, etc. Para almacenar estos pasos, creará un archivo que termina en .ps1 y lo guardará. De este modo, tendrá un script que podrá ejecutar.

Antes de empezar a aprender a crear scripts, vamos a echar un vistazo a las características del lenguaje de scripting de PowerShell:

  • Variables. Puede usar variables para almacenar valores. También puede usar variables como argumentos para los comandos.

  • Funciones. Una función es una lista con nombre de instrucciones. Las funciones generan una salida que se muestra en la consola. También puede usar funciones como entrada para otros comandos.

    Nota

    Muchas de las tareas para las que usaría PowerShell están relacionadas con efectos secundarios o modificaciones del estado del sistema (tanto si es local como si no). A menudo, la salida es un problema secundario (por ejemplo, datos de informes).

  • Control del flujo. El control del flujo consiste en controlar varias rutas de ejecución mediante construcciones como If, ElseIf y Else.

  • Bucles. Los bucles son construcciones que permiten trabajar en matrices, inspeccionar cada elemento y realizar algún tipo de operación en cada elemento. Pero los bucles van más allá de la iteración de la matriz. También puede continuar condicionalmente con la ejecución de un bucle mediante bucles Do-While. Para obtener más información, consulte Acerca de Do.

  • Control de errores. Es importante escribir scripts que sean sólidos y puedan controlar varios tipos de errores. Deberá conocer la diferencia entre los errores de terminación y de no terminación. Usará construcciones como Try y Catch. Se trata este tema en la última unidad conceptual de este módulo.

  • Expresiones. A menudo, usará expresiones en los scripts de PowerShell. Por ejemplo, para crear columnas personalizadas o expresiones de ordenación personalizadas. Las expresiones son representaciones de valores en la sintaxis de PowerShell.

  • Integración de .NET y .NET Core. PowerShell proporciona una integración eficaz con .NET y .NET Core. Dicha integración va más allá del ámbito de este módulo.

Ejecutar un script

Debe tener en cuenta que algunos scripts no son seguros. Si encuentra un script en Internet, probablemente no debería ejecutarlo en el equipo a menos que entienda exactamente qué hace. Incluso los scripts que considere seguros podrían conllevar un riesgo. Por ejemplo, imagine un script que limpia los elementos de un entorno de prueba. Dicho script podría ser perjudicial en un entorno de producción. Debe saber qué hace un script, si lo escribió usted o un compañero, o si procede de Internet.

PowerShell intenta protegerle para que no realice ninguna acción de forma involuntaria de dos principales formas:

  • Obligación de ejecutar scripts mediante una ruta de acceso completa o una ruta de acceso relativa. Al ejecutar un script, siempre debe proporcionar su ruta de acceso. De esta manera, sabrá exactamente qué está ejecutando. Por ejemplo, podría haber comandos y alias en el equipo que no le interesa ejecutar, pero que tienen el mismo nombre que el script. Al incluir la ruta de acceso, realiza una comprobación adicional para asegurarse de que ejecuta exactamente lo que quiere.
  • Directiva de ejecución. Una directiva de ejecución es una característica de seguridad. Al igual que el requisito de proporcionar la ruta de acceso de un script, una directiva puede impedir que realice acciones de forma involuntaria. La directiva se puede establecer en varios niveles, como el equipo local, el usuario actual o una sesión determinada. También puede usar una configuración de directiva de grupo para establecer directivas de ejecución para equipos y usuarios.

Estos dos mecanismos no le impedirán abrir un archivo, copiar su contenido, colocar el contenido en un archivo de texto y ejecutarlo. Tampoco le impedirán ejecutar el código mediante la consola. El objetivo de estos mecanismos consiste en impedir que realice una acción de forma involuntaria. No son un sistema de seguridad.

Para crear y ejecutar un script:

  1. Cree algunas instrucciones de PowerShell como las siguientes y guárdelas en un archivo que termine con .ps1:

    # PI.ps1
    $PI = 3.14
    Write-Host "The value of `$PI is $PI"
    
  2. Ejecute el script. Para ello, invóquelo por su nombre y ruta de acceso:

    Nota:

    Antes de ejecutar el script, asegúrese de que el shell actual es PowerShell. Como alternativa, en Linux o macOS, puede colocar el par de caracteres shebang en la parte superior del archivo de script para establecer PowerShell como el intérprete de scripts.

    ./PI.ps1
    

    Le recomendamos que incluya la extensión del archivo en la invocación, pero no es necesario.

Directiva de ejecución

Puede administrar la directiva de ejecución mediante estos cmdlets:

  • Get-ExecutionPolicy. Este cmdlet devuelve la directiva de ejecución actual. En Linux y macOS, el valor que se devuelve es Unrestricted. Para estos sistemas operativos, no se puede cambiar el valor. Esta limitación no hace que Linux o Mac sea menos seguros. Recuerde que una directiva de ejecución es una característica de seguridad, no un mecanismo de seguridad.

  • Set-ExecutionPolicy. Si usa un equipo Windows, puede usar este cmdlet para cambiar el valor de una directiva de ejecución. Requiere un parámetro -ExecutionPolicy. Hay varios valores posibles. Se recomienda usar Default como valor, ya que establece la directiva en Restricted en los clientes de Windows y en RemoteSigned en Windows Server. Restricted significa que no se pueden ejecutar scripts. Solo se pueden ejecutar comandos, lo que tiene sentido en un cliente. RemoteSigned significa que se pueden ejecutar los scripts que se han escrito en el equipo local. Los scripts descargados de Internet deben estar firmados con una firma digital de un publicador de confianza.

    Nota:

    Se pueden usar otros valores. Para obtener más información, consulte Acerca de las directivas de ejecución.

variables

Las variables no son exclusivas de los scripts. También puede definirlas en la consola. Los valores se pueden almacenar en variables para que se puedan usar más adelante. Para definir una variable, antepóngale el carácter $. Este es un ejemplo:

$PI = 3.14

Comillas e interpolación al trabajar con variables

Al generar texto mediante Write-Host o Write-Output, se pueden usar comillas simples o dobles. La elección depende de si se quiere interpolar los valores. Existen tres mecanismos que debe conocer:

  • Comillas simples. Las comillas simples especifican literales; lo que se escribe es lo que se obtiene. Veamos un ejemplo:

    Write-Host 'Here is $PI' # Prints Here is $PI
    

    Si quiere interpolar, para que el valor de $PI se interprete y se imprima, debe usar comillas dobles.

  • Comillas dobles. Cuando se usan comillas dobles, las variables de las cadenas se interpolan:

    Write-Host "Here is `$PI and its value is $PI" # Prints Here is $PI and its value is 3.14
    

    En este caso, suceden dos cosas. El acento invertido (`) establece un carácter de escape en lo que sería una interpolación de la primera instancia de $PI. En la segunda instancia, el valor se interpola y se escribe.

  • $(). También puede escribir una expresión entre comillas dobles. Para ello, use la construcción $(). Una manera de usar esta construcción consiste en interpolar propiedades de objetos. Este es un ejemplo:

    Write-Host "An expression $($PI + 1)" # Prints An expression 4.14
    

Ámbito

El ámbito es la forma en que PowerShell define dónde se pueden leer y cambiar construcciones como variables, alias y funciones. Al aprender a escribir scripts, debe saber a qué tiene acceso, qué puede cambiar y dónde puede cambiarlo. Si no entiende cómo funciona el ámbito, es posible que el código no funcione de la forma esperada.

Tipos de ámbito

Veamos los distintos tipos de ámbito:

  • Ámbito global. Al crear construcciones en este ámbito, como variables, seguirán existiendo una vez que finalice la sesión. Todo lo que esté presente al iniciar una nueva sesión de PowerShell se considera dentro del ámbito.

  • Ámbito de script. Al ejecutar un archivo de script, se crea un ámbito de script. Por ejemplo, una variable o una función definidas en el archivo se encuentran en el ámbito de script. Dejarán de existir una vez que el archivo termine de ejecutarse. Puede crear una variable, por ejemplo, en el archivo de script y establecer como destino el ámbito global. pero debe definir explícitamente ese ámbito. Para ello, anteponga la palabra clave global a la variable.

  • Ámbito local. El ámbito local es el ámbito actual y puede ser el ámbito global o cualquier otro ámbito.

Reglas de ámbito

Las reglas de ámbito ayudan a entender qué valores son visibles en un momento dado. También ayudan a comprender cómo se cambia un valor.

  • Los ámbitos pueden anidarse. Un ámbito puede tener un ámbito primario. Este es un ámbito externo, fuera de aquel en el que se encuentra. Por ejemplo, un ámbito local puede tener el ámbito global como ámbito primario. A su vez, un ámbito puede tener un ámbito anidado, también conocido como ámbito secundario.

  • Los elementos son visibles en los ámbitos actual y secundarios. Un elemento (como una variable o una función) es visible en el ámbito en el que se ha creado. De forma predeterminada, también es visible en todos los ámbitos secundarios. Puede cambiar este comportamiento si hace que el elemento sea privado dentro del ámbito. Este es un ejemplo en el que se usa una variable definida en la consola:

    $test = 'hi'
    

    Si tiene un archivo Script.ps1 que contiene el siguiente contenido, imprimirá "hi" cuando se ejecute el script:

    Write-Host $test # Prints hi
    

    Como puede ver, la variable $test es visible tanto en el ámbito local como en su ámbito secundario (en este caso, el ámbito de script).

  • Los elementos solo se pueden cambiar en el ámbito en el que se crearon. De forma predeterminada, solo puede cambiar un elemento en el ámbito en el que se creó. Puede cambiar este comportamiento si especifica explícitamente un ámbito diferente.

Profiles

Un perfil es un script que se ejecuta cuando se inicia PowerShell. Puede usar un perfil si quiere personalizar el entorno para, por ejemplo, cambiar los errores y los colores de fondo y realizar otros tipos de personalizaciones. PowerShell aplicará estos cambios a cada nueva sesión que inicie.

Tipos de perfil

PowerShell admite varios archivos de perfil. Puede aplicarlos en varios niveles, como se ve aquí:

Descripción Path
Todos los usuarios, todos los hosts $PSHOME\Profile.ps1
Todos los usuarios, host actual $PSHOME\Microsoft.PowerShell_profile.ps1
Usuario actual, todos los hosts $Home[My ]Documents\PowerShell\Profile.ps1
Usuario actual, host actual $Home[My ]Documents\PowerShell\Microsoft.PowerShell_profile.ps1

Hay dos variables aquí: $PSHOME y $Home. $PSHOME apunta al directorio de instalación de PowerShell. $Home es el directorio principal del usuario actual.

Otros programas también admiten perfiles, como Visual Studio Code.

Creación de un perfil

La primera vez que instala PowerShell, no hay perfiles, pero hay una variable $Profile. Se trata de un objeto que apunta a la ruta de acceso donde se debe colocar cada perfil que se va a aplicar. Para crear un perfil:

  1. Decida el nivel en el que quiere crear el perfil. Puede ejecutar $Profile | Select-Object * para ver los tipos de perfil y las rutas de acceso asociadas a ellos.

  2. Seleccione un tipo de perfil y cree un archivo de texto en su ubicación mediante un comando como este: New-Item -Path $Profile.CurrentUserCurrentHost.

  3. Agregue las personalizaciones que quiera al archivo de texto y guárdelo. La próxima vez que inicie una sesión, se aplicarán los cambios.