El poder de PowerShell, parte 1

PowerShell es un lenguaje interactivo de shell y scripting de Microsoft que replantea de qué se trata un shell de comandos. Tiene capacidades muy interesantes que van más allá de los shells conocidos de Unix, y hay un ecosistema y una comunidad sólidos.. 

En este tutorial de dos partes, aprenderá algunas de las cosas geniales que puede hacer con PowerShell, su historia, su arquitectura, sus conceptos y cómo se compara con un shell de Unix como Bash. Prepárate para un emocionante viaje!

Instalación de PowerShell

Si estás en Windows 10, estás listo. De lo contrario, descárgalo del sitio web de Microsoft..

Una vez que se instala PowerShell, lo primero que debe hacer es habilitar la ejecución del script. Inicie PowerShell como administrador y escriba: Set-ExecutionPolicy RemoteSigned. Necesitas hacerlo solo una vez. Ahora, actualice los archivos de ayuda: Actualización-Ayuda -Fuerza.

Cosas interesantes que puedes hacer con PowerShell

Comencemos con una rápida demostración de la amplitud y profundidad de PowerShell. Esta es solo una lista un tanto arbitraria para abrir el apetito. No es exhaustivo, ni son necesariamente las cosas más impresionantes que puede hacer con PowerShell.

Reproducir videos

Aquí hay una excelente guía para reproducir archivos de video (o cualquier archivo multimedia):

(New-object -COM WMPlayer.OCX) .openPlayer ("Ruta a tu video")

Se abrirá una ventana del reproductor de medios y comenzará a reproducir su video inmediatamente..

Aquí cuerdas

PowerShell tiene una de las soluciones más legibles y visualmente agradables para cadenas multilínea, AKA "aquí cadenas". Tu solo empiezas con @ " y terminar con "@. Tenga en cuenta que los marcadores de inicio y fin deben estar en su propia línea, separados del contenido intermedio. Aquí hay un ejemplo:

$ x = "@ 123 456 789 @"

Generar números aleatorios

Elija un número al azar entre 1 y 100:

1… 50 | Get-Random

Esta es una tubería simple. El lado izquierdo puede generar todos los enteros de 1 a 50 (inclusive), y luego se envía al cmdlet Get-Random que elige uno de ellos..

Trabajar con el portapapeles

PowerShell soporta el portapapeles en profundidad. Puedes obtener y configurar objetos de diferentes formatos. Obviamente, el texto plano es posible, pero también puede trabajar con imágenes, HTML, RTF e incluso archivos.

Aquí, selecciono algunos archivos en el explorador y luego los obtengo del portapapeles en PowerShell:

23:43:05 C: \ Users \ the_g> Get-Clipboard -Files Mode LastWriteTime Longitud Nombre ---- ------------- ------ ---- -a ---- 9/15/2016 11:41 PM 135890 Capture.PNG -a ---- 9/16/2016 10:09 PM 3179548 20160917_110605.jpg -a ---- 9/16/2016 10:09 PM 4623977 20160917_110734.jpg

Hablar

PowerShell puede hablar también!

Add-Type -AssemblyName System.speech $ synth = New-Object -TypeName System.Speech.Synthesis.SpeechSynthesizer $ synth.Speak ("PowerShell para la gente")

Obtener todas las máquinas virtuales en ejecución

Aquí hay un pequeño canal para enumerar todas las máquinas virtuales en ejecución:

Get-VM | Where-Object $ _. State -eq "En ejecución"

Mostrar barra de progreso

PowerShell puede mostrar una barra de progreso agradable durante operaciones largas. Aquí hay un ejemplo que calcula recursivamente el tamaño total de todos los archivos en el directorio actual:

$ files = Get-ChildItem. -Recibir $ total = 0 para ($ i = 1; $ i -le $ files.Count-1; $ i ++) Write-Progress -Activity "Calculando el tamaño total ..." -status $ files [$ i] .Name - PercentComplete ($ i / $ files.Count * 100) $ total + = $ files [$ i] .Length Start-Sleep -Milliseconds 50 Write-Host "Tamaño total: $ ($ total / 1MB)" 

Historia de PowerShell

PowerShell 1.0 se lanzó en 2006, pero su inventor Jeffery Snover comenzó a trabajar en él mucho antes. Echa un vistazo al manifiesto de 2002. PowerShell ha recorrido un largo camino. Windows estaba muy por detrás en términos de instalaciones de línea de comandos. Los administradores de sistemas y los usuarios avanzados tenían que conformarse con las escasas ofertas de cmd.exe y los archivos por lotes. Hubo algunos intentos débiles de mejorar las situaciones con los hosts de secuencias de comandos de Windows que permitían secuencias de comandos de objetos del sistema utilizando VBScript o JScript, pero hay muchos problemas con ese enfoque.

PowerShell cambió todo eso y muy rápidamente. No solo coincidía con las capacidades de línea de comando de los entornos * nix, sino que se adelantó con muchas innovaciones y una consistencia y facilidad de uso sin precedentes..

Hoy, PowerShell está en la versión 5.1. A lo largo de los años y las versiones, las capacidades de PowerShell y los entornos de alojamiento crecieron significativamente.. 

PowerShell 1.0 Administración local admitida de máquinas Windows (incluido Windows Server 2003).

PowerShell 2.0 Se integró con Windows 7 y Windows Server 2008 R2. Agregó soporte para la comunicación remota y aumentó significativamente las capacidades de PowerShell con trabajos en segundo plano, transacciones, eventos, depuración, un entorno de desarrollo de GUI y muchos nuevos cmdlets..

PowerShell 3.0 fue lanzado como parte del marco de administración de Windows. Se instaló en Windows 8 y Windows Server 2012. Agregó trabajos programados, conectividad de sesión, carga automática de módulos y muchos nuevos comandos..

PowerShell 4.0 Se integró con Windows 8.1 y Windows Server 2012 R2. Añadió soporte para la configuración de estado deseada, depuración mejorada, diagnósticos de red y la -PipelineVariable cambiar.

PowerShell 5.0 se lanzó como parte del marco de administración de Windows 5. PowerShell 5.1 se lanzó como parte de las actualizaciones de aniversario de Windows 10. Las nuevas características incluyen definiciones de clase de PowerShell, enumeraciones .NET, trabajos remotos de depuración y depuración remotos, administrador de configuración local de DSC y muchas más mejoras de DSC.

PowerShell: El lenguaje de scripting

PowerShell es un lenguaje de programación muy potente. Puede ejecutar scripts, obviamente, pero también tiene mecanismos más avanzados como módulos, cmdlets personalizados y clases. PowerShell es un lenguaje de múltiples paradigmas que admite los paradigmas orientados a objetos, funcionales y de procedimiento.. 

Pero quizás el aspecto más importante de PowerShell es que es un lenguaje .NET completo. Crea y utiliza objetos .NET ensamblados programados en cualquier idioma, y ​​los objetos que pasan a través de la tubería de PowerShell son objetos .NET. PowerShell también está fuertemente tipado, pero cuando es conveniente puede ignorarlo y no tiene que especificar los tipos si no quiere.

Scripting de procedimiento

Para programar de manera procesal, necesita funciones, condicionales y bucles. PowerShell tiene todo eso. Los operadores de comparación pueden sorprenderte ya que no usan los símbolos típicos. En su lugar tienes: -eq (igual), -es (menos que), -gt (mas grande que), -ge (mayor o igual), etc.. 

Aquí hay un ejemplo de lógica condicional que obtiene información del usuario y verifica que es válida. Tenga en cuenta el uso de la -como Operador para tratar de convertir la entrada a un entero. Si falla, el resultado es $ nulo.

$ value = 44 $ in = Read-Host "Adivina un número entre 1 - 100" $ guess = $ in -as [int] if ((($ guess -eq $ null) -o ($ guess -lt 1)) -o ($ guess -gt 100)) Write-Host "$ guess no es un número entero entre 1 - 100" Salir si ($ guess -eq $ valor) Write-Host "¡Usted gana!"  elseif ($ guess -lt $ value) Write-Host "Demasiado bajo" else else Write-Host "Demasiado alto" 

PowerShell tiene muchas instalaciones y cmdlets para trabajar con colecciones y cortarlos y cortarlos en dados, por lo que los bucles no suelen ser necesarios. Pero, en caso de que estés tan inclinado, hay muchas construcciones descabelladas en PowerShell. Puede utilizar bucles For, bucles ForEach, bucles While, bucles Do-While e incluso bucles de objetos ForEach especiales. Aquí hay unos ejemplos.

Para ($ i = 0; $ i -lt 100; $ i + = 20) $ i 0 20 40 60 80 $ lista = 1… 5 ForEach ($ artículo en $ lista) $ artículo * 3 3 6 9 12 15 $ later = $ (Get-Date) .AddSeconds (5) while ($ (Get-Date) -lt $ later) "¿Ya llegamos?" sleep 1 PS C: \ WINDOWS \ system32> $ later = $ (Get-Date) .AddSeconds (5) while ($ (Get-Date) -lt $ later) "¿Ya llegamos?" dormir 1 ¿Ya llegamos? ¿Ya llegamos? ¿Ya llegamos? ¿Ya llegamos? Ya llegamos?

Programación Funcional

PowerShell tiene que ver con la programación funcional. La canalización es un entorno de ejecución funcional en el que se componen funciones / cmdlets dinámicamente. Puedes hacerlo de forma interactiva o puedes hacerlo en un script. Si desea realizar una programación funcional explícita, también puede hacerlo, pero la sintaxis es un poco incómoda. Echa un vistazo a este artículo: Programación funcional en PowerShell.

Programación orientada a objetos

Ya ha visto cómo usar los objetos .NET y los objetos que pasan por la tubería. Definamos una clase en PowerShell y hagamos un OO básico. Creo aquí una clase para un personaje de juego con salud y armadura que puede sufrir daños y calcular su salud. También hay un IsAlive () Método que verifica si la salud es> 0. Yo uso un constructor. 

Tenga en cuenta que debe crear una instancia de las clases de PowerShell usando El]::nuevo(). La sintaxis de objetos nuevos no es compatible a partir de PowerShell 5.1.

carácter de clase [string] $ Name [int] $ Health [int] $ AttackDamage [float] $ Armor Character ([string] $ name, [int] $ health, [int] $ attackDamage, [float] $ armor)  $ this.Name = $ name $ this.Health = $ health $ this.AttackDamage = $ attackDamage $ this.Armor = $ armor [bool] IsAlive () return $ this.Health -gt 0 [void] TakeDamage ( [int] $ daño) if ($ this.armor -gt 0) $ daño = $ daño - 0.4 * $ esto.Armor * $ daño $ this.Health - = $ daño $ c = [Carácter] :: nuevo ("xxx", 50, 10, 1.0) $ c.TakeDamage (20) $ c.IsAlive () True $ c.Health 38 $ c.TakeDamage (40) $ c.Health 14 $ c.TakeDamage ( 40) $ c.Salud -10 $ c.IsAlive () Falso 

Incluso puede hacer herencia si lo desea, pero creo que en este punto probablemente debería usar un idioma diferente..

Entorno de script interactivo

PowerShell viene con su propio IDE para el desarrollo de secuencias de comandos que incluye una ventana interactiva, varias pestañas para secuencias de comandos con finalización de código, ayuda integrada en todos los cmdlets y mucho más. Es una herramienta muy hábil, y te recomiendo que la pruebes..

Conclusión

Ahora ha visto las capacidades de PowerShell como un lenguaje de scripting y ha aprendido un poco sobre sus objetivos de diseño y su historia. En la segunda parte, cubriré en profundidad los aspectos interactivos de PowerShell..