Perfiles PowerShell
Introducción
La noción de perfil es una noción familiar para los profesionales IT como nosotros ya que existen desde hace mucho tiempo en Windows con, entre otros, el famoso «perfil Windows» (que puede ser local o remoto), así como el perfil de Outlook. Un perfil es simplemente un archivo (o conjunto de archivos) que contiene las preferencias del usuario.
Tendrá a partir de ahora que componer perfiles adicionales, los de PowerShell. Y pueden ser numerosos, ya que ¡podemos crear hasta una decena diferentes si así lo deseamos! Los perfiles PowerShell son sencillamente scripts ejecutados automáticamente al arrancar la consola PowerShell, y eso en un orden determinado. Permiten configurar nuestro entorno PowerShell para, por ejemplo, cargar automáticamente funciones o asignar ciertas variables. Veremos varios casos de uso en este capítulo.
Una noción importante que debe conocer asociada a los perfiles PowerShell es la de «símbolo del sistema». El símbolo del sistema es un entorno de ejecución PowerShell.
De partida, conocemos dos símbolos del sistema que son la consola clásica y la consola gráfica ISE, aunque existen, sin embargo, muchos otros, como Visual Studio Code, PowerGUI, etc. Cada uno de estos símbolos del sistema puede, si lo desea, tener en cuenta los perfiles que le son propios.
Perfiles disponibles
Podemos determinar la lista de perfiles que se pueden utilizar en el símbolo del sistema en ejecución - aquí la consola Windows PowerShell estándar - gracias al siguiente comando:
PS > $profile | Format-List * -force
AllUsersAllHosts :
C:\Windows\System32\WindowsPowerShell\v1.0\profile.ps1
AllUsersCurrentHost : C:\Windows\System32\WindowsPowerShell\v1.0\
Microsoft.PowerShell_profile.ps1
CurrentUserAllHosts : C:\Users\Arnaud\Documents\
WindowsPowerShell\profile.ps1
CurrentUserCurrentHost : C:\Users\Arnaud\Documents\
WindowsPowerShell\Microsoft.PowerShell_profile.ps1
Length : 80
Podemos observar que se nos ofrecen cuatro perfiles diferentes. Veremos más adelante a qué se corresponde cada uno de estos perfiles. Observe que, si bien están referenciados en la variable $profile, ninguno de estos archivos está creado. Es algo que debe hacer usted.
La misma línea de comando aplicada al entorno ISE nos devolverá un resultado ligeramente distinto:
PS > $profile | Format-List * -force
AllUsersAllHosts : C:\Windows\System32\WindowsPowerShell\v1.0\
profile.ps1
AllUsersCurrentHost : C:\Windows\System32\WindowsPowerShell\v1.0\ ...
Orden de aplicación de perfiles
El orden de aplicación de perfiles es importante. PowerShell los aplica en el siguiente orden:
1. AllUsersAllHosts
2. AllUsersCurrentHost
3. CurrentUserAllHosts
4. CurrentUserCurrentHost
Como de costumbre son los parámetros los más cercanos al usuario los prioritarios y por lo tanto se aplican en último lugar. Por ejemplo, si define varias veces la misma variable en sus perfiles, será la última definición la que tendrá la última palabra.
Creación de un perfil
Por defecto, ningún perfil está creado. El método más simple para crear su perfil consiste en apoyarse en la variable $profile. Efectivamente, como hemos visto anteriormente, esta variable contiene en sus propiedades las rutas hacia los distintos perfiles que PowerShell tiene en cuenta.
Ahora vamos a crear un perfil que será común a todas las consolas (o símbolos del sistema) pero que se aplicará solo a nosotros. Para ello, debemos elegir la propiedad CurrentUserAllHosts de la variable $profile.
Verifiquemos primero hacia qué carpeta apunta esta propiedad:
PS > $profile.CurrentUserAllHosts
C:\Users\Arnaud\Documents\WindowsPowerShell\profile.ps1
Para crear su perfil, teclee el comando:
PS > New-Item -Path $profile.CurrentUserAllHosts -ItemType file -Force
-force permite aquí crear la jerarquía de carpetas si esta no existe al crear el archivo.
Enhorabuena, su perfil se ha creado pero ocupa cero bytes ya que está vacío. Para modificarlo con el editor gráfico ISE, teclee el siguiente comando:
PS > ise $profile.CurrentUserAllHosts
PS > code $profile.CurrentUserAllHosts
Ahora está preparado para personalizar su entorno preferido. Podría por ejemplo cambiar el color de fondo de la ventana, su tamaño, el color de las caracteres, añadir...
Personalización del entorno
Todo lo que vamos a ver ahora es para que lo incluya en su perfil. Deberá elegir lo que más se adecue a sus necesidades.
1. Modificación del prompt
El prompt es el conjunto de caracteres que indican que el equipo está listo para que los comandos se puedan introducir.
Por defecto, tiene el siguiente aspecto: PS RUTA_ACTUAL>
Se encontrará al arrancar PowerShell en el directorio raíz de su perfil Windows, o sea en Windows 10 y Windows Server 2016: C:\Users\NombreDelUsuario.
Aquí tiene el prompt por defecto:
Prompt por defecto al arrancar la consola
PowerShell Core le sitúa por defecto en la carpeta de instalación, que en Windows es C:\Program Files\PowerShell\6.0.0.
Para modificar el prompt, basta con redefinir la función Prompt de PowerShell. Veamos primero qué contiene en su configuración de origen. Para visualizar su contenido, vamos a invocar al proveedor Function gracias a su lector function: como se muestra a continuación:
PS > Get-Content function:prompt
"PS $($executionContext.SessionState.Path.CurrentLocation)`
$('>' * ($nestedPromptLevel + 1)) "
# .Link
# http://go.microsoft.com/fwlink/?LinkID=225750
# .ExternalHelp System.Management.Automation.dll-help.xml
La función Prompt llama a la variable automática $executionContext que representa el contexto de ejecución del símbolo del sistema actual. Mirándola de cerca, podemos comprender las siguientes cosas:
-
Recupera la ruta actual (0).
-
Duplica el carácter > tantas veces como niveles tiene el prompt actual (1).
-
Concatena las cadenas anteriores para obtener una cadena como sigue: PS (0)(1)
$nestedpromptlevel indica si nos encontramos en un entorno embebido. Si esta variable contiene un número superior a cero, significa que nos encontramos en un entorno embebido (caso particular cuando se está depurando).
Resulta muy fácil redefinir la función Prompt, así podemos por ejemplo decidir eliminar del prompt la ruta actual ya que, muchas veces debido a esto, el prompt es infinitamente largo. Por lo tanto cuando navegamos por una jerarquía de directorios profunda, nuestra línea de comandos no cabe en una sola línea haciendo incómoda la lectura. Sin embargo, para no privarnos de esta información interesante...
Ejecutar PowerShell sin perfil
En ciertos casos, es necesario lanzar PowerShell sin perfil para no alargar inútilmente el tiempo de apertura de la consola y/o para estar seguro de no molestar la correcta ejecución de un script. Esto resulta muy útil para ejecutar scripts PowerShell mediante una tarea programada.
Los ejecutables PowerShell.exe (Windows PowerShell) y pswh.exe (PowerShell Core) poseen para ello el parámetro -Noprofile.
Así podemos escribir, por ejemplo, la línea de comandos siguiente para iniciar PowerShell ignorando cualquier perfil y ejecutar miScript.ps1:
PS > pwsh.exe -noprofile -file ./miScript.ps1
Existen numerosos parámetros disponibles. Para obtener una lista exhaustiva, teclee powershell.exe /? o pwsh;exe / ? .