Plus tôt cette année, PowerShell Core est devenu généralement disponible sous une licence Open Source (MIT). PowerShell n'est pas une nouvelle technologie. Depuis sa première version pour Windows en 2006, les créateurs de PowerShell ont cherché à incorporer la puissance et la flexibilité des shells Unix tout en remédiant à leurs lacunes perçues, en particulier le besoin de manipulation de texte pour tirer parti de la combinaison de commandes.
Cinq versions majeures plus tard, PowerShell Core permet au même environnement innovant de shell et de commande de s'exécuter de manière native sur tous les principaux systèmes d'exploitation, y compris OS X et Linux. Certains (lire :presque tout le monde ) peut encore se moquer de l'audace et/ou de la témérité de cet intrus né de Windows pour s'offrir à des plates-formes qui ont eu des environnements shell solides depuis des temps immémoriaux (au moins tel que défini par un millénaire). Dans cet article, j'espère démontrer que PowerShell peut offrir des avantages même aux utilisateurs chevronnés.
Cohérence entre les plates-formes
Si vous envisagez de porter vos scripts d'un environnement d'exécution à un autre, vous devez vous assurer que vous n'utilisez que les commandes et les syntaxes qui fonctionnent. Par exemple, sur les systèmes GNU, vous obtiendriez la date d'hier comme suit :
date --date="1 day ago"
Sur les systèmes BSD (tels que OS X), la syntaxe ci-dessus ne fonctionnerait pas, car l'utilitaire de date BSD nécessite la syntaxe suivante :
date -v -1d
Étant donné que PowerShell est concédé sous une licence permissive et conçu pour toutes les plates-formes, vous pouvez l'expédier avec votre application. Ainsi, lorsque vos scripts s'exécutent dans l'environnement cible, ils s'exécutent sur le même shell en utilisant les mêmes implémentations de commande que l'environnement dans lequel vous avez testé vos scripts.
Objets et données structurées
Les commandes et utilitaires *nix dépendent de votre capacité à consommer et à manipuler des données non structurées. Ceux qui vivent depuis des années avec sed
grep
et awk
peut être indifférent à cette déclaration, mais il existe un meilleur moyen.
Reprenons l'exemple de la date d'hier dans PowerShell. Pour obtenir la date actuelle, exécutez le Get-Date
applet de commande (prononcé "commandlet") :
> Get-Date
Dimanche 21 janvier 2018 20:12:41
La sortie que vous voyez n'est pas vraiment une chaîne de texte. Il s'agit plutôt d'une représentation sous forme de chaîne d'un objet .Net Core. Comme tout autre objet dans n'importe quel autre environnement POO, il a un type et le plus souvent, des méthodes que vous pouvez appeler.
Prouvons ceci :
> $(Get-Date).GetType().FullName
System.DateTime
Le $(...)
La syntaxe se comporte exactement comme on s'y attendrait des shells POSIX - le résultat de l'évaluation de la commande entre parenthèses est remplacé par l'expression entière. Dans PowerShell, cependant, $ est strictement facultatif dans de telles expressions. Et, plus important encore, le résultat est un objet .Net, pas du texte. Nous pouvons donc appeler le GetType()
méthode sur cet objet pour obtenir son objet de type (similaire à Class
objet en Java), et le FullName
propriété pour obtenir le nom complet du type.
Alors, comment cette orientation objet vous facilite-t-elle la vie ?
Tout d'abord, vous pouvez diriger n'importe quel objet vers le Get-Member
applet de commande pour voir toutes les méthodes et propriétés qu'elle a à offrir.
> (Get-Date) | Get-Member
PS /home/yevster/Documents/ArticlesInProgress> $(Get-Date) | Get-Member
TypeName :System.DateTime
Name MemberType Definition
---- ---------- - ----------
Ajoutez la méthode DateTime Ajouter (Timespan Valeur)
Méthode Adddays DateTime Adddays (Valeur double)
Méthode AddHours DateTime AddHours (Valeur double)
AddMillisecondes Méthode DateTime AddMillisecondes (Valeur double)
Méthode Addminutes DateTime Addminutes (Valeur double)
Méthode AddMonths DateTime AddMonths (int mois)
Méthode AddSeconds DateTime AddSeconds (Valeur double)
Méthode AddTicks Datetime AddTicks(long value)
AddYears Method datetime AddYears(int value)
Méthode CompareTo Méthode int CompareTo(System.Object value), int ...
Vous pouvez rapidement voir que l'objet DateTime a un AddDays
que vous pouvez rapidement utiliser pour obtenir la date d'hier :
> (Get-Date).AddDays(-1)
Samedi 20 janvier 2018 20:24:42
Pour faire quelque chose d'un peu plus excitant, appelons le service météo de Yahoo (car il ne nécessite pas de jeton API) et obtenons votre météo locale.
$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"
Maintenant, nous pourrions faire les choses à l'ancienne et simplement lancer curl $url
pour obtenir un blob géant de JSON, ou...
$weather=(Invoke-RestMethod $url)
Si vous regardez le type de $weather
(en exécutant echo $weather.GetType().FullName
), vous verrez qu'il s'agit d'un PSCustomObject
. C'est un objet dynamique qui reflète la structure du JSON.
Et PowerShell sera ravi de vous aider à le parcourir avec son achèvement d'onglet. Tapez simplement $weather.
(en veillant à inclure le ".") et appuyez sur Tab. Vous verrez toutes les clés JSON de niveau racine. Tapez-en un, suivi d'un ".
", appuyez à nouveau sur Tab, et vous verrez ses enfants (le cas échéant).
Ainsi, vous pouvez facilement naviguer vers les données souhaitées :
> ECHO $ Météo.Query.Results.Channel.Atmosphère.Pressure
1019.0
> Echo $ Météo.Query.Results.Channel.wind.chill
41Et si vous avez JSON ou CSV qui traînent (ou sont renvoyés par une commande extérieure) en tant que données non structurées, dirigez-les simplement dans le
ConvertFrom-Json
ouConvertFrom-CSV
cmdlet, respectivement, et vous pouvez avoir vos données dans de beaux objets propres.Informatique contre automatisation
Nous utilisons des coquilles à deux fins. L'un est pour l'informatique, pour exécuter des commandes individuelles et pour répondre manuellement à leur sortie. L'autre est l'automatisation, pour écrire des scripts qui exécutent plusieurs commandes et répondent à leur sortie par programmation.
Un problème que la plupart d'entre nous ont appris à ignorer est que ces deux objectifs imposent des exigences différentes et contradictoires au shell. L'informatique nécessite que le shell soit laconique. Moins un utilisateur peut utiliser de touches, mieux c'est. Peu importe si ce que l'utilisateur a tapé est à peine lisible pour un autre être humain. Les scripts, en revanche, sont du code. La lisibilité et la maintenabilité sont essentielles. Et ici, les utilitaires POSIX nous échouent souvent. Bien que certaines commandes offrent à la fois des syntaxes laconiques et lisibles (par exemple,
-f
et--force
) pour certains de leurs paramètres, les noms de commande eux-mêmes privilégient la brièveté et non la lisibilité.PowerShell inclut plusieurs mécanismes pour éliminer ce compromis faustien.
Tout d'abord, la complétion par tabulation élimine la saisie des noms d'arguments. Par exemple, tapez
Get-Random -Mi
, appuyez sur Tab et PowerShell complétera l'argument pour vous :Get-Random -Minimum
. Mais si vous voulez vraiment être laconique, vous n'avez même pas besoin d'appuyer sur Tab. Par exemple, PowerShell comprendraGet-Random -Mi 1 -Ma 10
parce que
Mi
etMa
chacun a des complétions uniques.Vous avez peut-être remarqué que tous les noms d'applet de commande PowerShell ont une structure verbe-nom. Cela peut améliorer la lisibilité du script, mais vous ne voulez probablement pas continuer à taper
Get-
encore et encore dans la ligne de commande. Alors non ! Si vous tapez un nom sans verbe, PowerShell recherchera unGet-
commande avec ce nom.Attention :bien que PowerShell ne soit pas sensible à la casse, il est recommandé de mettre en majuscule la première lettre du nom lorsque vous avez l'intention d'utiliser une commande PowerShell. Par exemple, en tapant
date
appellera ladate
de votre système utilitaire. TaperDate
appelleraGet-Date
de PowerShell applet de commande.Et si cela ne suffit pas, PowerShell dispose d'alias pour créer des noms simples. Par exemple, si vous saisissez
alias -name cd
, vous découvrirez lecd
La commande dans PowerShell est elle-même un alias pour leSet-Location
commande.Donc, pour passer en revue, vous bénéficiez d'une complétion de tabulation puissante, d'alias et de complétions de noms pour garder vos noms de commande courts, automatiques et cohérents la troncature des noms de paramètres, tout en bénéficiant d'une syntaxe riche et lisible pour les scripts.
Alors... les amis ?
Il n'y a que quelques-uns des avantages de PowerShell. Il y a plus de fonctionnalités et d'applets de commande dont je n'ai pas parlé (consultez Where-Object ou son alias
?
si vous voulez fairegrep
pleurer). Et bon, si vous avez vraiment le mal du pays, PowerShell se fera un plaisir de lancer vos anciens utilitaires natifs pour vous. Mais donnez-vous suffisamment de temps pour vous acclimater au monde des applets de commande orientées objet de PowerShell, et vous risquez de choisir d'oublier le chemin du retour.