PowerShell Utilities Series: vitaminas para tu PowerShell con PSReadLine

Update (23/03/2015): José Ángel Fernández nos ha informado que las instrucciones de instalación del módulo pueden fallar con determinados formatos de fecha de Windows. Agregamos en tal caso el método de instalación manual.

Hace algunas semanas hablábamos de cómo los administradores de sistemas pasamos buena parte de nuestra vida en la línea de comandos y de como utilidades como el DMCredential la hace más fácil y eficiente. Continuando con esta serie de post de utilidades para la línea de comandos por excelencia en Microsoft Windows, PowerShell, en esta ocasión le toca el turno a una de las más versátiles y potentes: PSReadLine.

PSReadLine es un módulo para PowerShell en su versión 3 o posterior desarrollado por Jason Shirk que mejora considerablemente nuestra experiencia con la línea de comandos, agregando la siguiente funcionalidad a nuestra consola:

  • Resaltado de sintaxis en tiempo real mientras escribimos.
  • Notificación de errores de sintaxis, ¡antes de que presionemos ENTER y ejecutemos el cmdlet!
  • Edición multi-línea sin abrir editores de texto.
  • Atajos de teclado personalizables.
  • Deshacer/Rehacer.
  • Autoguardado del historial de cmdlet para consultarlo entre sesiones.
  • Intellisense (CTRL+SPACE)
  • Guiños a usuarios de UNIX:
    • Modo Emacs.
    • Autocompletar estilo Bash
    • Búsqueda interactiva en el historial estilo Bash/zsh (CTRL+R)

El módulo es tan intuitivo que no se necesitan conocimientos especiales para comenzar a usarlo.

Instalación

Hay dos formas automatizadas de instalar este módulo: con Windows Management Framework 5.0 (en preview en el momento de escribir estas líneas) o bien usando PsGet.

Si alguna de estas presenta problemas podemos también instalarlo de forma manual.

Windows Management Framework 5.0

En caso de que usemos WMF 5.0 la instalación es tan simple como hacer lo siguiente:

PsGet

PsGet es una herramienta que se utiliza para automatizar la instalación, actualización y eliminación de módulos de PowerShell. Como tal, la herramienta simplifica la instalación de PSReadLine al mismo nivel que WMF 5.0. No hay que confundirla con Chocolatey, que instala cualquier software en general; PsGet es exclusivo para módulos de PowerShell. Para instalar PsGet debemos ejecutar lo siguiente:

Hecho esto ya sólo nos quedaría instalar el módulo de la misma forma que haríamos con WMF 5.0:

Instalación manual

En caso de que nos fallen los métodos anteriores siempre podemos hacer una instalación manual del mismo:

  1. Descargar la última versión del módulo desde aquí.
  2. Descomprimir los contenidos del ZIP en C:Users[User]DocumentsWindowsPowerShellmodulesPSReadline. Crear las carpetas necesarias si no existen.

Hacer que el módulo se cargue al abrir la consola

Seguimos las mismas instrucciones que hacíamos con el ls a color:

  1. Editamos el archivo: $Home[My ]DocumentsWindowsPowerShellProfile.ps1 o bien $Home[My ]DocumentsProfile.ps1 según el tipo de profile que usemos.
  2. Agregamos la línea Import-Module PSReadLine.

Uso

¿Tienes el módulo ya instalado? ¡Abre una nueva consola de PowerShell e importa el módulo!

Resaltado de sintaxis

Nada más empezar a escribir verás que el módulo colorea la sintaxis mientras escribes en la consola.

psreadline1

Detección de errores de sintaxis

Si hay algún error de sintaxis mientras escribes la sentencia, podrás ver como el color del prompt cambia a rojo.

psreadline2

Intellisense inline

Presiona CTRL+SPACE mientras estás escribiendo un cmdlet para que aparezca un menú de autocompletar estilo Intellisense.

psreadline3

Edición multilínea

¿Te has encontrado con alguna situación como la de la captura de pantalla siguiente y has necesitado volver a la primera línea? Ahora es perfectamente posible.

psreadline4

Establecer atajos de teclado y modificar opciones

Es posible controlar el comportamiento de PSReadLine mediante el sustantivo PSReadLineOption y PSReadLineKeyHandler:

¡Y aún más!

Podéis encontrar más información y descargar el código fuente del proyecto desde su web en GitHub.

Happy PowerShelling!

Enlace relacionado: PSReadLine homepage
Enlace relacionado: Keith Hill’s Blog, PSReadLine: A Better Line Editing Experience for the PowerShell Console
Enlace relacionado: Ed Wilson, Scripting Guy, The Search for a Better PowerShell Console Experience

0 pensamientos en “PowerShell Utilities Series: vitaminas para tu PowerShell con PSReadLine”

  1. Gracias ! Interesante. Es un tema muy amplio.

    Y habría que comentar mucho más de PsGet, Chocolatey, OneGet, myget… yo aún me pierdo.

    NuGet, MyGet, Chocolatey, OneGet… what?! People ask questions and occasionally can’t see the forest for the trees. Here’s a quick recap:

    NuGet: a solution-level package management tool, used to manage software dependencies within the scope of a solution. It is accompanied by the NuGet Gallery, the home of many if not all .NET open source components.

    Chocolatey: a system-level package management tool, used to manage software installations on a Windows system. It (currently) leverages PowerShell and NuGet, supports the Web Platform Installer (WebPI), MSI, RubyGems and many more, and is accompanied by the Chocolatey Gallery where you can find many popular software packages. Rob describes Chocolatey as somewhat like “apt-get”, but with Windows in mind.

    MyGet: a hosted NuGet package server where you can create and secure your own feeds. In essence, MyGet is able to host vanilla NuGet feeds, as well as Chocolatey feeds.

    OneGet: a a unified interface to package management systems (see above)

    Saludos

  2. Genial. No entiendo mucho siendo un paquete en esto más al igual que se puede instalar Hotfix programáticamente
    http://www.nigelboulton.co.uk/2011/01/installing-a-windows-hotfix-on-multiple-machines-using-a-powershell-script/

    La Instalación manual también se podría automatizar con Powershell, para hacerlo todo programáticamente, focalizando en unas tareas básicas:

    Descargar un ZIP a partir de su url. Lo único considerar si se requiere proxy.
    Descomprimir el ZIP en una carpeta y crear subcarpetas necesarias.
    Modificar un archivo ps1 para agregar una línea (si ésta no existe)

    Lo ideal claro sería tener un control de errores programáticamente de estos pasos:

    (new-object Net.WebClient).DownloadString(“http://psget.net/GetPsGet.ps1”) | iex

    Install-Module PSReadLine

    Y en caso de fallo realizar los pasos anteriores de forma programática.

    Y yendo un paso más, realizar estos pasos en una máquina remota (de la intranet) si se gestionan muchas máquinas.

    Por ejemplo, imagino que Azure internamente utiliza sus Powershell propios (deben ser la ostia claro) para manejar las VM’s Hyper-V y hacer estas tareas básicas y muchas más.

    Saludos.

    1. Totalmente correcto, sería posible automatizarlo de la forma me comentas, incluso para su instalación en máquinas remotas. De hecho el PsGet hace algo muy similar pero sin la incorporación del Import-Module al profile.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *