A principios de este año, PowerShell Core estuvo disponible de forma general bajo una licencia de código abierto (MIT). PowerShell no es una tecnología nueva. Desde su primer lanzamiento para Windows en 2006, los creadores de PowerShell buscaron incorporar el poder y la flexibilidad de los shells de Unix mientras remediaban sus deficiencias percibidas, particularmente la necesidad de manipulación de texto para obtener valor de la combinación de comandos.
Cinco lanzamientos importantes más tarde, PowerShell Core permite que el mismo entorno innovador de shell y comando se ejecute de forma nativa en todos los principales sistemas operativos, incluidos OS X y Linux. Algunos (léase:casi todos ) aún puede burlarse de la audacia y/o la temeridad de este intruso nacido en Windows para ofrecerse a plataformas que han tenido entornos de shell fuertes desde tiempos inmemoriales (al menos como lo define un millennial). En esta publicación, espero demostrar que PowerShell puede brindar ventajas incluso a los usuarios experimentados.
Coherencia entre plataformas
Si planea migrar sus scripts de un entorno de ejecución a otro, debe asegurarse de usar solo los comandos y sintaxis que funcionan. Por ejemplo, en los sistemas GNU, obtendría la fecha de ayer de la siguiente manera:
date --date="1 day ago"
En sistemas BSD (como OS X), la sintaxis anterior no funcionaría, ya que la utilidad de fecha BSD requiere la siguiente sintaxis:
date -v -1d
Debido a que PowerShell tiene una licencia permisiva y está diseñado para todas las plataformas, puede enviarlo con su aplicación. Por lo tanto, cuando sus secuencias de comandos se ejecuten en el entorno de destino, se ejecutarán en el mismo shell utilizando las mismas implementaciones de comandos que el entorno en el que probó sus secuencias de comandos.
Objetos y datos estructurados
*Los comandos y las utilidades nix se basan en su capacidad para consumir y manipular datos no estructurados. Aquellos que han vivido durante años con sed
grep
y awk
Puede que esta declaración no le moleste, pero hay una mejor manera.
Rehagamos el ejemplo de la fecha de ayer en PowerShell. Para obtener la fecha actual, ejecute Get-Date
cmdlet (pronunciado "commandlet"):
> Get-Date
Sunday, January 21, 2018 8:12:41 PM
El resultado que ve no es realmente una cadena de texto. Más bien, es una representación de cadena de un objeto .Net Core. Al igual que cualquier otro objeto en cualquier otro entorno de programación orientada a objetos, tiene un tipo y, en la mayoría de los casos, métodos a los que puede llamar.
Probemos esto:
> $(Get-Date).GetType().FullName
System.DateTime
El $(...)
la sintaxis se comporta exactamente como cabría esperar de los shells POSIX:el resultado de la evaluación del comando entre paréntesis se sustituye por la expresión completa. En PowerShell, sin embargo, $ es estrictamente opcional en tales expresiones. Y, lo más importante, el resultado es un objeto .Net, no texto. Entonces podemos llamar al GetType()
en ese objeto para obtener su tipo de objeto (similar a Class
objeto en Java), y el FullName
propiedad para obtener el nombre completo del tipo.
Entonces, ¿cómo esta orientación a objetos hace tu vida más fácil?
Primero, puede canalizar cualquier objeto al Get-Member
cmdlet para ver todos los métodos y propiedades que tiene para ofrecer.
> (Get-Date) | Get-Member
PS /home/yevster/Documents/ArticlesInProgress> $(Get-Date) | Get-Member
TypeName: System.DateTime
Name MemberType Definition
---- ---------- ----------
Add Method datetime Add(timespan value)
AddDays Method datetime AddDays(double value)
AddHours Method datetime AddHours(double value)
AddMilliseconds Method datetime AddMilliseconds(double value)
AddMinutes Method datetime AddMinutes(double value)
AddMonths Method datetime AddMonths(int months)
AddSeconds Method datetime AddSeconds(double value)
AddTicks Method datetime AddTicks(long value)
AddYears Method datetime AddYears(int value)
CompareTo Method int CompareTo(System.Object value), int ...
Puede ver rápidamente que el objeto DateTime tiene un AddDays
que puede usar rápidamente para obtener la fecha de ayer:
> (Get-Date).AddDays(-1)
Saturday, January 20, 2018 8:24:42 PM
Para hacer algo un poco más emocionante, llamemos al servicio meteorológico de Yahoo (porque no requiere un token API) y obtengamos el clima local.
$city="Boston"
$state="MA"
$url="https://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20weather.forecast%20where%20woeid%20in%20(select%20woeid%20from%20geo.places(1)%20where%20text%3D%22${city}%2C%20${state}%22)&format=json&env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys"
Ahora, podríamos hacer las cosas a la antigua y simplemente ejecutar curl $url
para obtener una gota gigante de JSON, o...
$weather=(Invoke-RestMethod $url)
Si miras el tipo de $weather
(ejecutando echo $weather.GetType().FullName
), verá que es un PSCustomObject
. Es un objeto dinámico que refleja la estructura del JSON.
Y PowerShell estará encantado de ayudarlo a navegar por él con su pestaña para completar. Simplemente escriba $weather.
(asegurándose de incluir el ".") y presione Tabulador. Verá todas las claves JSON de nivel raíz. Escriba uno, seguido de un ".
", presiona Tab de nuevo y verás sus elementos secundarios (si los hay).
Por lo tanto, puede navegar fácilmente a los datos que desee:
> echo $weather.query.results.channel.atmosphere.pressure
1019.0
> echo $weather.query.results.channel.wind.chill
41
Y si tiene JSON o CSV por ahí (o devuelto por un comando externo) como datos no estructurados, simplemente canalícelos a ConvertFrom-Json
o ConvertFrom-CSV
cmdlet, respectivamente, y puede tener sus datos en objetos agradables y limpios.
Informática versus automatización
Usamos conchas para dos propósitos. Uno es para computación, para ejecutar comandos individuales y responder manualmente a su salida. El otro es la automatización, para escribir secuencias de comandos que ejecutan varios comandos y responden a su salida mediante programación.
Un problema que la mayoría de nosotros hemos aprendido a pasar por alto es que estos dos propósitos imponen requisitos diferentes y contradictorios al caparazón. La informática requiere que el caparazón sea lacónico. Cuantas menos pulsaciones de teclas pueda hacer un usuario, mejor. No es importante si lo que el usuario ha escrito es apenas legible para otro ser humano. Los scripts, por otro lado, son código. La legibilidad y la mantenibilidad son clave. Y aquí, las utilidades POSIX a menudo nos fallan. Si bien algunos comandos ofrecen sintaxis lacónica y legible (por ejemplo, -f
y --force
) para algunos de sus parámetros, los nombres de los comandos se equivocan por el lado de la brevedad, no de la legibilidad.
PowerShell incluye varios mecanismos para eliminar esa compensación faustiana.
En primer lugar, la finalización con tabuladores elimina la escritura de nombres de argumentos. Por ejemplo, escriba Get-Random -Mi
, presione Tabulador y PowerShell completará el argumento por usted:Get-Random -Minimum
. Pero si realmente quieres ser lacónico, ni siquiera necesitas presionar Tabulador. Por ejemplo, PowerShell entenderá
Get-Random -Mi 1 -Ma 10
porque Mi
y Ma
cada uno tiene terminaciones únicas.
Es posible que haya notado que todos los nombres de cmdlet de PowerShell tienen una estructura de verbo-sustantivo. Esto puede ayudar a la legibilidad del script, pero probablemente no quiera seguir escribiendo Get-
una y otra vez en la línea de comando. ¡Así que no! Si escribe un sustantivo sin verbo, PowerShell buscará un Get-
comando con ese sustantivo.
Precaución:aunque PowerShell no distingue entre mayúsculas y minúsculas, es una buena práctica escribir en mayúscula la primera letra del sustantivo cuando pretenda usar un comando de PowerShell. Por ejemplo, escribiendo date
llamará a la date
de su sistema utilidad. Escribiendo Date
llamará a Get-Date
de PowerShell cmdlet.
Y si eso no es suficiente, PowerShell tiene alias para crear nombres simples. Por ejemplo, si escribe alias -name cd
, descubrirás el cd
El comando en PowerShell es en sí mismo un alias para Set-Location
comando.
Entonces, para repasar:obtiene un potente completado de pestañas, alias y sustantivos para mantener los nombres de sus comandos breves, automáticos y coherentes. truncamiento del nombre del parámetro, sin dejar de disfrutar de una sintaxis rica y legible para secuencias de comandos.
Entonces... ¿amigos?
Estas son solo algunas de las ventajas de PowerShell. Hay más funciones y cmdlets de los que no he hablado (consulte Where-Object o su alias ?
si quieres hacer grep
llorar). Y oye, si realmente sientes nostalgia, PowerShell estará encantado de lanzar tus antiguas utilidades nativas por ti. Pero tómese el tiempo suficiente para aclimatarse al mundo de los cmdlets orientados a objetos de PowerShell y es posible que decida olvidar el camino de regreso.