Vuélvase profesional: la guía del usuario avanzado de PowerShell

Si ha luchado con Windows 10, sin duda ha oído hablar de PowerShell. Si ha intentado hacer algo elegante con Win7 / 8.1 recientemente, es probable que también surja PowerShell. Después de años de depender de la línea de comandos de Windows y de los archivos por lotes combinados, es hora de poner la mira en algo más potente, más adaptable, mejor.

PowerShell es una enorme adición a la caja de herramientas de Windows y puede provocar un poco de miedo dada esa enormidad. ¿Es un lenguaje de secuencias de comandos, una consola de comandos, una cera para pisos? ¿Tiene que vincular un cmdlet con una clase .Net instanciada para ejecutar con proveedores? ¿Y por qué todos los documentos de soporte hablan de administradores? ¿Tengo que ser un administrador profesional de Windows para utilizarlo?

Relajarse. PowerShell es poderoso, pero no tiene por qué ser intimidante.

La siguiente guía está dirigida a aquellos que han ejecutado uno o dos comandos de Windows o han manipulado un archivo por lotes. Considérelo una transformación paso a paso de PowerShell curiosa a compatible con PowerShell.

Paso 1: ponlo en marcha

Lo primero que necesitará es PowerShell. Si está utilizando Windows 10, ya tiene PowerShell 5, la última versión, instalada. (La actualización de aniversario de Win10 tiene 5.1, pero no notará la diferencia con la 5.0 de la actualización de otoño). Windows 8 y 8.1 se envían con PowerShell 4, que es lo suficientemente bueno para mojarse los pies. La instalación de PowerShell en Windows 7 no es difícil, pero requiere un cuidado adicional y es necesario instalar .Net Framework por separado. JuanPablo Jofre detalla cómo instalar WMF 5.0 (Windows Management Framework), que incluye PowerShell, además de herramientas que probablemente no usará al comenzar, en MSDN.

PowerShell ofrece dos interfaces. Los usuarios avanzados optarán por la GUI completa, conocida como Integrated Scripting Environment (ISE). Los principiantes, sin embargo, se benefician mejor con la consola PowerShell, una interfaz de texto simple que recuerda a la línea de comandos de Windows, o incluso DOS 3.2.

Para iniciar PowerShell como administrador desde Windows 10, haga clic en Inicio y desplácese hacia abajo en la lista de aplicaciones hasta Windows PowerShell. Haga clic en esa línea, haga clic con el botón derecho en Windows PowerShell y elija Ejecutar como administrador. En Windows 8.1, busque Windows PowerShell en la carpeta Sistema de Windows. En Win7, está en la carpeta Accesorios. Puede ejecutar PowerShell como un usuario "normal" siguiendo la misma secuencia pero con un clic izquierdo.

En cualquier versión de Windows, puede usar la búsqueda de Windows para buscar PowerShell. En Windows 8.1 y Windows 10, puede ponerlo en su Ctrl-X "Menú de energía" (haga clic con el botón derecho en un espacio en blanco en la barra de tareas y elija Propiedades; en la pestaña Navegación, marque la casilla para Reemplazar símbolo del sistema). Una vez que lo tenga abierto, es una buena idea anclar PowerShell a su barra de tareas. Sí, te va a gustar mucho.

Paso 2: escriba comandos de Windows anticuados

Se sorprenderá de la cantidad de sintaxis de la línea de comandos de Windows que funciona como se esperaba en PowerShell.

Por ejemplo, cdcambia de directorio (también conocido como carpetas) y diraún enumera todos los archivos y carpetas incluidos en la carpeta actual.

Dependiendo de cómo inicie la consola de PowerShell, puede comenzar en c:\Windows\system32o en c:\Users\. En el ejemplo de captura de pantalla, utilizo cd ..(observe el espacio) para subir un nivel a la vez, luego ejecuto dirpara listar todos los archivos y subcarpetas en el C:\directorio.

Paso 3: instale los archivos de ayuda

Los comandos como cdy dirno son comandos nativos de PowerShell. Son alias, sustitutos de los comandos de PowerShell reales. Los alias pueden ser útiles para aquellos de nosotros con una memoria de dedos que es difícil de superar. Pero ni siquiera comienzan a tocar las partes más importantes de PowerShell.

Para comenzar a familiarizarse con PowerShell, escriba helpseguido de un comando que conozca. Por ejemplo, en la captura de pantalla, escribo help dir.

La ayuda de PowerShell me dice que dires un alias para el comando de PowerShell Get-ChildItem. Efectivamente, si escribe get-childitemen el PS C:\>indicador, verá exactamente lo que vio con el dircomando.

Como se indica en la parte inferior de la captura de pantalla, los archivos de ayuda para PowerShell no se instalan automáticamente. Para recuperarlos (que no quiere conseguirlos), iniciar sesión en PowerShell en el modo de administrador, a continuación, escriba update-help. La instalación de los archivos de ayuda llevará varios minutos y es posible que le falten algunos módulos: la ayuda para NetWNV y SecureBoot no se instalaron en mi máquina de prueba. Pero cuando haya terminado, el sistema de ayuda completo estará a su entera disposición.

A partir de ese momento, escriba get-helpseguido del comando ("cmdlet" en PowerShell speak, pronunciado "command-let") que le concierne y vea toda la ayuda para ese elemento. Por ejemplo, get-help get-childitemproduce un resumen de las get-childitemopciones. También le pide que escriba variaciones sobre el tema. Así, lo siguiente:

get-help get-childitem -examples

produce siete ejemplos detallados de cómo utilizar get-childitem. El comando de PowerShell

get-help get-childitem -detailed

incluye esos siete ejemplos, así como una explicación detallada de cada parámetro disponible para el get-childitemcmdlet.

Paso 4: obtenga ayuda sobre los parámetros

En la help dircaptura de pantalla, es posible que haya notado que hay dos listados debajo SYNTAXde get-childitem. El hecho de que haya dos sintaxis independientes para el cmdlet significa que hay dos formas de ejecutar el cmdlet. ¿Cómo se mantienen las sintaxis separadas y qué significan los parámetros? La respuesta es fácil, si conoce el truco.

Para obtener todos los detalles sobre los parámetros del get-childitemcmdlet, o cualquier otro cmdlet, use el -fullparámetro, como este:

get-help get-childitem -full

Eso produce una lista línea por línea de lo que puede hacer con el cmdlet y lo que puede (¡o no!) Suceder. Vea la captura de pantalla.

Examinando los detalles de los parámetros, es razonablemente fácil ver que get-childitemse pueden usar para recuperar elementos "secundarios" (como los nombres de subcarpetas o nombres de archivos) en una ubicación que especifique, con o sin coincidencias de caracteres específicos. Por ejemplo:

get-childItem “*.txt” -recurse

recupera una lista de todos los *.txtarchivos " " en la carpeta actual y todas las subcarpetas (debido al -recurseparámetro). Considerando lo siguiente:

get-childitem “HKLM:\Software”

devuelve una lista de todas las claves de registro de alto nivel en HKEY_LOCAL_MACHINE\Software.

Si alguna vez ha intentado ingresar al registro usando una línea de comandos de Windows o un archivo por lotes, estoy seguro de que puede ver cuán poderoso debe ser este tipo de acceso.

Paso 5: Clave los nombres

Hay una razón por la cual los cmdlets que hemos visto hasta ahora tienen el mismo aspecto: get-childitem, update-helpy get-helptodos siguen la misma convención verbo-sustantivo. Afortunadamente, todos los cmdlets de PowerShell usan esta convención, con un verbo que precede a un sustantivo (singular). Aquellos de ustedes que pasaron semanas luchando por comandos VB y VBA con nombres inconsistentes pueden respirar aliviados.

Para ver hacia dónde vamos, eche un vistazo a algunos de los cmdlets más comunes (gracias al blog Hey, Scripting Guy! De Ed Wilson). Comience con los cmdlets que llegan a su sistema y extraiga información útil, como la siguiente:

  • set-location: Establece la ubicación de trabajo actual en una ubicación específica
  • get-content: Obtiene el contenido de un archivo
  • get-item: Obtiene archivos y carpetas
  • copy-item: Copia un elemento de una ubicación a otra
  • remove-item: Elimina archivos y carpetas
  • get-process: Obtiene los procesos que se ejecutan en una computadora local o remota
  • get-service: Obtiene los servicios que se ejecutan en una computadora local o remota
  • invoke-webrequest: Obtiene contenido de una página web en Internet

Para ver cómo funciona un cmdlet en particular, use get-help, como en

get-help copy-item -full

Según su descripción de ayuda, puede averiguar fácilmente lo que quiere el cmdlet. Por ejemplo, si desea copiar todos sus archivos y carpetas de Documentsa c:\temp, usaría:

copy-item c:\users\[username] \documents\* c:\temp

A medida que escribe ese comando, verá algunos toques agradables integrados en el entorno de PowerShell. Por ejemplo, si escribe copy-iy presiona la tecla Tab, PowerShell rellena Copy-Itemun espacio. Si escribe mal un cmdlet y PowerShell no puede resolverlo, obtendrá una descripción muy completa de lo que salió mal.

Pruebe este cmdlet. (Puede intentar que instale un programa para leer el cuadro "Acerca de". Si es así, ignórelo).

invoke-webrequest askwoody.com

Obtiene una lista sucinta de las declaraciones de contenido, encabezados, imágenes, enlaces y más de la página web. ¿Ves cómo funciona eso? Observe en la get-helplista invoke-webrequestque el invoke-webrequestcmdlet “devuelve colecciones de formularios, vínculos, imágenes y otros elementos HTML importantes”, exactamente lo que debería ver en su pantalla.

Algunos cmdlets le ayudan a controlar o asimilar el propio PowerShell:

  • get-command: Enumera todos los cmdlets disponibles (¡es una lista larga!)
  • get-verb: Enumera todos los verbos disponibles (las mitades izquierdas de los cmdlets)
  • clear-host: Borra la pantalla en el programa anfitrión

Varios parámetros (recuerde get-help) le permiten reducir los comandos y limitar las opciones que pueden ser útiles para usted. Por ejemplo, para ver una lista de todos los cmdlets que funcionan con los servicios de Windows, intente esto:

get-command *-service

Enumera todos los verbos que están disponibles con serviceel sustantivo. Aquí está el resultado:

Get-Service

New-Service

Restart-Service

Resume-Service

Set-Service

Start-Service

Stop-Service

Suspend-Service

Puede combinar estos cmdlets con otros cmdlets para profundizar en casi cualquier parte de PowerShell. Ahí es donde entran en escena las tuberías.

Paso 6: Traiga las tuberías

Si alguna vez ha utilizado la línea de comandos de Windows o ha trabajado con dificultad en un archivo por lotes, sabe acerca de la redirección y las canalizaciones. En términos simples, tanto la redirección (el  >personaje) como las tuberías (el |personaje) toman el resultado de una acción y lo colocan en otro lugar. Puede, por ejemplo, redirigir la salida de un dircomando a un archivo de texto, o "canalizar" el resultado de un pingcomando a un find, para filtrar resultados interesantes, así:

dir > temp.txt

ping askwoody.com | find “packets” > temp2.txt

En el segundo comando anterior, el findcomando busca la cadena packetsen la salida canalizada de un askwoody.com pingy pega todas las líneas que coinciden en un archivo llamado temp2.txt.

Quizás sorprendentemente, el primero de esos comandos funciona bien en PowerShell. Para ejecutar el segundo comando, desea algo como esto:

ping askwoody.com | select-string packets | out-file temp2.txt

El uso de redirecciones y canalizaciones amplía enormemente las capacidades de la línea de comandos de Windows: en lugar de desplazarse sin cesar por una pantalla en busca de una cadena de texto, por ejemplo, puede armar un comando de Windows canalizado que realice la verificación por usted.

PowerShell tiene una capacidad de canalización, pero no se limita al texto. En cambio, PowerShell le permite pasar un objeto completo de un cmdlet al siguiente, donde un "objeto" es una combinación de datos (llamados propiedades) y las acciones (métodos) que se pueden usar en los datos.

La parte difícil, sin embargo, radica en alinear los objetos. El tipo de objeto entregado por un cmdlet debe coincidir con los tipos de objetos aceptados por el cmdlet receptor. El texto es un tipo de objeto muy simple, por lo que si trabaja con texto, alinear elementos es fácil. Otros objetos no son tan rudimentarios.

¿Cómo averiguarlo? Bienvenido al get-membercmdlet. Si desea saber qué tipo de objeto produce un cmdlet, canalícelo get-member. Por ejemplo, si está intentando averiguar los procesos que se ejecutan en su equipo y ha reducido las opciones al get-processcmdlet, así es como averigua qué get-processproduce el cmdlet:

get-process | get-member

La ejecución de ese comando produce una larga lista de propiedades y métodos para get-process, pero al principio de la lista puede ver el tipo de objeto que get-process crea:

TypeName: System.Diagnostics.Process

La captura de pantalla a continuación también le dice que get-processtiene propiedades llamadas Handles, Name, NPM, PM, SI, VM, y WS.

Si desea manipular la salida de get-processpara poder trabajar con él (en lugar de que muestre una lista larga de procesos activos en el monitor), debe buscar otro cmdlet que funcione System.Diagnostics.Processcomo entrada. Para encontrar un cmdlet dispuesto, simplemente use ... espere ... PowerShell:

get-command -Parametertype System.Diagnostics.Process

Eso produce una lista de todos los cmdlets que pueden manejar System.Diagnostics.Process.

Algunos cmdlets son conocidos por aceptar casi cualquier tipo de entrada. El principal de ellos: where-object. Quizás de manera confusa, where-objectrecorre cada elemento enviado por la tubería, uno por uno, y aplica los criterios de selección que solicite. Hay un marcador especial llamado $_. que le permite recorrer cada elemento de la tubería, uno a la vez.

Supongamos que desea obtener una lista de todos los procesos que se ejecutan en su máquina y que se denominan “ svchost”; en términos de PowerShell, desea hacer coincidir una Namepropiedad de  svchost. Pruebe este comando de PowerShell:

get-process | where-object {$_.Name -eq “svchost”}

El where-objectcmdlet examina cada System.Diagnostics.Processelemento, compara el .Namede ese elemento con “ svchost”; si el elemento coincide, se escupe por el extremo de la tubería y se escribe en su monitor. Vea la captura de pantalla.