Spanish (Español) translation by Andrea Jiménez (you can also view the original English article)
PowerShell ha estado en desarrollo durante más de diez años. Microsoft continúa invirtiendo en su desarrollo y adopción. Estas inversiones han transformado la facilidad y la solidez con que los desarrolladores y administradores pueden automatizar las tareas de Windows.
¿Qué es PowerShell?
PowerShell resuelve los desafíos de administración y adaptabilidad al integrar perfectamente el framework .NET.
PowerShell es el framework de automatización de tareas de Microsoft, que consiste en un shell de línea de comandos, un entorno de secuencias de comandos integrado (ISE), un lenguaje de secuencias de comandos integrado en el framework .NET, una API que te permite alojar PowerShell en tus aplicaciones .NET, y es una plataforma de automatización distribuida. PowerShell proporciona acceso completo a COM y WMI, lo que te permite realizar tareas en sistemas Windows locales y remotos.
PowerShell es una plataforma de nueva generación para la automatización, ya que resuelve los desafíos de administración y adaptabilidad al integrar perfectamente el framework .NET. Es bueno para desarrolladores, administradores, probadores y más. Basado en .NET, la herramienta reduce los costos, al tiempo que proporciona a los desarrolladores y administradores una forma simple y lista para la empresa de automatizar, medir y mejorar todos sus procesos.
Seguimiento
En esta introducción, resaltaré algo de la profundidad y amplitud que PowerShell aporta a la mesa. Cosas como la canalización de objetos que cambia el juego, REPL (lectura, evaluación, ciclo de impresión), integración .NET y más.
Si estás ejecutando Windows 7 u 8, PowerShell ya está instalado. Descarga PowerShell v3 para Windows 7 aquí. Necesitas Windows 7 SP1 y la descarga también funciona para Windows 2008 R2 SP1 y Windows 2008 SP2. Si estás ejecutando Vista, XP o Windows 2003, deberás conformarte con PowerShell v2 aquí.
¿Para que sirve? ¡Absolutamente para todo!
Desde la implementación de múltiples recursos en Azure, hasta el manejo de tus compilaciones de software para una integración continua, el acceso a servicios web o puntos finales REST. PowerShell te cubre y te ofrece mucho más.
- Corta y fragmenta texto, XML, CSV y JSON con facilidad
- Integra la consola de PowerShell para ejecutar comandos dentro de tus aplicaciones en C#
- Crea aplicaciones GUI de cinco a diez veces más rápido y con menos código
- Aprovecha las capacidades de PowerShell para trabajar con Internet
- Interactúa con archivos DLL y crea objetos, muestra automáticamente propiedades y llama a métodos en sesiones interactivas en vivo
- Crea lenguajes y vocabularios específicos de dominio (DSL) para expresar soluciones más claramente
- Trabaja con Microsoft Office a través del Modelo de objetos de componentes (COM)
- Características de PowerShell v3
Iniciando en PowerShell
¿Qué es un cmdlet? Un cmdlet es el bloque de construcción fundamental en PowerShell y se expresa como un par verbo-sustantivo, lo que ayuda a que sean autodescriptivos. Por ejemplo:
PS C:\> Get-Date Sunday, May 26, 2013 8:46:16 AM
PowerShell incluye cientos de cmdlets principales y puedes escribir los tuyos.
Memoriza dos cmdlets
PowerShell facilita la capacidad de descubrimiento. Siempre que vayas hacia la pantalla azul de PowerShell y no estés seguro de qué hacer, usa Get-Command
.
El cmdlet
Get-Command
obtiene todos los comandos que están instalados en la computadora, incluidos cmdlets, apodos, funciones, flujos de trabajo, filtros, scripts y aplicaciones.
En esencia, Get-Command
te muestra todas las cosas que puedes hacer en la sesión actual de PowerShell.
Get-Command
Get-Command
admite comodines. Digamos que quiero ver todos los cmdlets que tiene el verbo Invoke
.
Get-Command Invoke*
Esto es lo que obtengo después de presionar enter
.
CommandType Name ModuleName ----------- ---- ---------- Function Invoke-AsWorkflow PSWorkflowUtility Function Invoke-Background ShowUI Function Invoke-BrowserControl AutoBrowse Function Invoke-Line isepack Function Invoke-Line PowerShellPack Function Invoke-Office365 Pipeworks Function Invoke-Pester Pester Function Invoke-WebCommand Pipeworks Cmdlet Invoke-CimMethod CimCmdlets Cmdlet Invoke-Command Microsoft.PowerShell.Core Cmdlet Invoke-Expression Microsoft.PowerShell.Utility Cmdlet Invoke-History Microsoft.PowerShell.Core Cmdlet Invoke-Item Microsoft.PowerShell.Management Cmdlet Invoke-RestMethod Microsoft.PowerShell.Utility Cmdlet Invoke-TroubleshootingPack TroubleshootingPack Cmdlet Invoke-WebRequest Microsoft.PowerShell.Utility Cmdlet Invoke-WmiMethod Microsoft.PowerShell.Management Cmdlet Invoke-WSManAction Microsoft.WSMan.Management
¿Cuáles son los cmdlets que terminan en el sustantivo Item?
Get-Command *-Item
Ten en cuenta que comienzas a ver otros verbos, como Borrar, Nuevo, Eliminar y Establecer.
CommandType Name ModuleName ----------- ---- ---------- Cmdlet Clear-Item Microsoft.PowerShell.Management Cmdlet Copy-Item Microsoft.PowerShell.Management Cmdlet Get-Item Microsoft.PowerShell.Management Cmdlet Invoke-Item Microsoft.PowerShell.Management Cmdlet Move-Item Microsoft.PowerShell.Management Cmdlet New-Item Microsoft.PowerShell.Management Cmdlet Remove-Item Microsoft.PowerShell.Management Cmdlet Rename-Item Microsoft.PowerShell.Management Cmdlet Set-Item Microsoft.PowerShell.Management
A continuación, usaré algunos cmdlets para resumir lo que está disponible en mi sesión en uno de mis cuadros cuando inicio la consola PowerShell.
Get-Command | Group CommandType -NoElement | Sort Count -Descending
Pongo Get-Command
, lo agrupo y lo ordeno. Aquí, puedo ver que tengo más de 1000 Cmdlets para trabajar. Estoy ejecutando PowerShell v3 con módulos adicionales instalados, por lo que tu kilometraje puede variar.
Count Name ----- ---- 2487 Function 1184 Cmdlet 38 Alias 1 Filter
¿De qué módulos son estos cmdlets? Podemos responder esa pregunta de esta manera:
Get-Command -CommandType Cmdlet | Group ModuleName -NoElement | Sort Count -Descending
Hay muchas cosas que puedo lograr con PowerShell.
Count Name ----- ---- 379 ShowUI 164 Hyper-V 157 Azure 92 Microsoft.PowerShell.Utility 82 Microsoft.PowerShell.Management 78 WebAdministration 55 Microsoft.PowerShell.Core 22 Dism 18 International 17 PKI 16 PSScheduledJob 13 Microsoft.WSMan.Management 12 CimCmdlets 10 Microsoft.PowerShell.Security 9 TrustedPlatformModule 8 BitsTransfer 8 MsDtc 6 Pipeworks 6 Kds 5 AppLocker 5 SecureBoot 5 Microsoft.PowerShell.Diagnostics 4 NetSecurity 4 Appx 3 WindowsErrorReporting 2 Microsoft.PowerShell.Host 2 TroubleshootingPack 1 PSWorkflow 1 DnsClient
Get-Help
Get-Help
hace exactamente eso, muestra ayuda para el cmdlet sobre el que debes saber más. No solo es fácil obtener ayuda, es fácil crear/incluir ayuda para los cmdlets / funciones avanzadas que desarrolles, un tema para otro artículo. Tener ayuda a tu alcance es un gran ahorro de tiempo.
Get-Help Invoke-Command
Aquí hay una versión corta de la salida.
NAME Get-Process SYNOPSIS Gets the processes that are running on the local computer or a remote computer. SYNTAX Get-Process [[-Name] <String[]>] [-ComputerName <String[]>] [-FileVersionInfo [<SwitchParameter>]] [-Module [<SwitchParameter>]] [<CommonParameters>] Get-Process [-ComputerName <String[]>] [-FileVersionInfo [<SwitchParameter>]] [-Module [<SwitchParameter>]] -Id <Int32[]> [<CommonParameters>] Get-Process [-ComputerName <String[]>] [-FileVersionInfo [<SwitchParameter>]] [-Module [<SwitchParameter>]] -InputObject <Process[]> [<CommonParameters>] DESCRIPTION The Get-Process cmdlet gets the processes on a local or remote computer. . . . .
Más fácil aún; hay un cambio para esto en el cmdlet Get-Help , eso te lleva aquí.
Get-Help Get-Process -Online
¿Quieres ver ejemplos de cómo usar el cmdlet? Usa el modificador -Examples
. Además, puedes copiar y pegar ejemplos directamente en la consola y ejecutarlos.
Get-Help Get-Process -Examples
Es así de fácil y rápido.
NAME Get-Process SYNOPSIS Gets the processes that are running on the local computer or a remote computer. -------------------------- EXAMPLE 1 -------------------------- PS C:\> Get-Process This command gets a list of all of the running processes running on the local computer. For a definition of each column, see the "Additional Notes" section of the Help topic for Get-Help. -------------------------- EXAMPLE 2 -------------------------- PS C:\> Get-Process winword, explorer | format-list *
PowerShell funciona fácilmente con servicios web
El W3C define un "servicio web" como:
[...] un sistema de software diseñado para respaldar la interacción interoperable de máquina a máquina a través de una red. Tiene una interfaz descrita en un formato procesable por máquina (específicamente WSDL). Otros sistemas interactúan con el servicio web de la manera prescrita por su descripción usando mensajes SOAP, típicamente transmitidos usando HTTP con una serialización XML junto con otros estándares relacionados con la web.
PowerShell hace un trabajo rápido de los servicios web, utilizando el cmdlet New-WebServiceProxy
. Cambia el $zipcode
, ejecútalo y obtén la información meteorológica más reciente.
$zipCode = "96826" $svc = New-WebServiceProxy http://wsf.cdyne.com/WeatherWS/Weather.asmx $result = $svc.GetCityForecastByZIP($zipCode) # Transform the results $result.ForecastResult | ForEach { [PSCustomObject]@{ City = $result.City State = $result.State Date = $_.Date.ToString("d") Description = $_.Desciption DaytimeHigh = $_.Temperatures.DaytimeHigh } }
Resultado
Almaceno el objeto proxy en $svc
y luego llamo al método GetCityForecastByZIP
, capturando los resultados en $result
. Al recorrer la matriz ForecastResult, transformo el registro en los datos. Ten en cuenta que City y DaytimeHigh están en diferentes niveles en la jerarquía.
La técnica que estoy usando es crear pares clave / valor para la tabla hash. @ {}
es la sintaxis de PowerShell para una nueva tabla hash. El uso de [PSCustomObject]
es un acelerador de PowerShell, que me permite, por un lado, crear un objeto personalizado a partir de una tabla hash.
El servicio web Weather.asmx
retornó un XML jerárquico. En una serie de comandos de PowerShell, modifiqué los datos y los formateé (la Fecha) a mi gusto. Para este ejemplo, elegí dejar que PowerShell lo imprima. Una vez que tengo los datos en mi sesión de PowerShell, estoy conectado al ecosistema de PowerShell y puedo conectar fácilmente esta matriz de objetos personalizados a otros cmdlets para enviarlos a otro servicio web, generar HTML, guardarlo en un archivo, crear un archivo CSV o exportarlo a una base de datos SQL.
City State Date Description DaytimeHigh ---- ----- ---- ----------- ----------- Honolulu HI 5/22/2013 Showers 76 Honolulu HI 5/23/2013 Partly Cloudy 76 Honolulu HI 5/24/2013 Partly Cloudy 77 Honolulu HI 5/25/2013 Partly Cloudy 77 Honolulu HI 5/26/2013 Partly Cloudy 77 Honolulu HI 5/27/2013 Partly Cloudy 77 Honolulu HI 5/28/2013 Partly Cloudy 77
Trabajando con CSV, JSON y XML
Fragmentar los formatos de texto es un punto ideal de PowerShell. Aquí, convertiré tres formatos comunes a un objeto de PowerShell. Para CSV y JSON, usaré los cmdlets ConvertFrom- *
correctos, y para el XML, usaré el
acelerador que toma XML y crea un documento XML.
# Use CSV $csv = "Name,Age`r`nJohn,10" | ConvertFrom-Csv $csv Name Age ---- --- John 10 # Use JSON $json = "{Name:'Tom', Age:20}" | ConvertFrom-Json $json Name Age ---- --- Tom 20 # Use XML $xml = ([xml][/xml]"<data><record><Name>Harry</Name><Age>30</Age></record></data>").data.record $xml Name Age ---- --- Harry 30 # Combine all three $csv,$json,$xml Name Age ---- --- John 10 Tom 20 Harry 30 # Add up the ages $csv,$json,$xml | % {$sum=0} {$sum+=$_.age} {$sum} 60
Entonces, tomamos tres formatos heterogéneos y, al final, realizamos una agregación sobre uno de los campos. Podría haber recuperado cada una de estas fuentes de datos de varios lugares, el CSV de un recurso compartido de red, el JSON de una consulta REST y el XML de un servicio web. Como dije, este es un punto ideal de PowerShell.
Búsqueda de Twitter
Usemos la API REST de búsqueda de Twitter en la línea de comando. Construyo la Url, que puedes usar en tu navegador, y luego uso el cmdlet de PowerShell Invoke-RestMethod.
Envía una solicitud al servicio REST y determina si la respuesta es XML o JSON. Aquí solicito una respuesta JSON, así que Invoke-RestMethod
convierte los resultados en una matriz de objetos de PowerShell. Los canalizo al cmdlet Select
(un alias del verbo-sustantivo Select-Object
) eligiendo solo tres campos. Piensa en esto como una proyección, similar a LINQ o SQL.
$query = "PowerShell" $url = "http://search.twitter.com/search.json?q=$query" (Invoke-RestMethod $url).results | Select created_at, from_user_name, text
Resultado
Es fácil. Mira un video que hice para la versión 2: "PowerShell, ShowUI y la API de Twitter". Una mini aplicación de Twitter WPF en una serie de PowerShell.
created_at from_user_name text ---------- -------------- ---- Sat, 25 May 2013 vitor pombeiro @brunomlopes a falar sobre Powershell "à minha maneira" Sat, 25 May 2013 Jeffery Hicks Did you know the #PowerShell ISE has startup options? In Sat, 25 May 2013 Pat Richard @mwjcomputing Yeah - had always used $MyInvocation.MyCom Sat, 25 May 2013 Rob Fairman "#PowerShell Script for Clearing #Windows Event Logs" ht Sat, 25 May 2013 Jim Priestley Automating SharePoint Deployments in Windows #Azure usin Sat, 25 May 2013 VT Technology RT @jangwoo_park: “@VTTechnology: Export Multiple Virtua Sat, 25 May 2013 Aryan Nava Using PowerShell to view Site created on the previous da Sat, 25 May 2013 Aryan Nava PowerShell Tips for SQL Server http://t.co/lVW2AY5BYZ Sat, 25 May 2013 Private Cloud Tech The Journey to the Private Cloud Part 3 – The Infrastruc Sat, 25 May 2013 Dr Tom Shinder The Journey to the Private Cloud Part 3 – The Infrastruc Sat, 25 May 2013 Jacob Daniels RT @tech_faq: Windows Server Manager is based on Windows Sat, 25 May 2013 CodeCruiser 10 Tips for the SQL Server PowerShell Scripter http://t.
Compilar C # sobre la marcha en PowerShell
PowerShell es un lenguaje interpretado. Entonces, habrá una penalización. No es un problema importante, pero, a veces, necesitarás la velocidad de un lenguaje compilado. PowerShell te permite compilar C # sobre la marcha en la memoria en tu sesión de PowerShell, utilizando el parámetro -TypeDefinition
en el cmdlet Add-Type
. Ten en cuenta el here-string
identificado por la @" "@
. Son súper útiles al citar texto. Te invito a explorar más con las reglas de cotización de Add-Type
y PowerShell.
Add-Type -TypeDefinition @" public class TestInline { public long Fibonacci(long n) { long a = 0; long b = 1; for (long idx = 0; idx < n; idx+=1) { long temp = a; a = b; b = temp + b; } return a; } } "@ $obj = New-Object TestInline 1..10 | ForEach { $obj.Fibonacci($_) }
Interactuando con DLLS
Ahora, digamos que no te di el código fuente, solo la DLL compilada. No hay problema: Add-Type
tiene un parámetro -Path
.
Add-Type -Path .\FibLib.dll $obj = New-Object TestInline 1..10 | ForEach { $obj.Fibonacci($_) }
Presta especial atención a esto. Usar Add-Type
de esta manera es cómo encajar fácilmente cualquier DLL .NET que provenga de alguien, si aún no han proporcionado una interfaz de PowerShell. Esto es cierto si la DLL es de Microsoft, DELL, Citrix u otro desarrollador.
Para concluir
Entonces eso es todo por ahora. ¿Deseas ver más contenido específico de Powershell en Nettuts +? Déjanos saber a continuación!