Entrer dans le monde merveilleux des équipes de prod, fait de |,<, >,grep et autres joyeusetés, n'a jamais vraiment été un de mes rêves - trouvant qu'une console MMC et/ou un peu de macros Word/Excel faisait le même boulot ou presque. Cela va peut-être changer avec l'arrivée (en RC) de Windows Powershell (déjà sorti en beta sous le nom de code Monad) !
Cela fait maintenant a peu près deux heures que je joue avec ce futur remplaçant de la Commande "MSDOS" et, franchement,c'est tout simplement génial.
Allez, commençons par quelques exemples sympa permettant de voir toute la puissance de ce bidule :
Cette ligne de commande récupère tous les services sur la machine :
get-service
Pour envoyer une ou plusieurs lignes dans un fichier il suffit de faire :
set-content c:\resultat.txt
(le set-content s’arrete automatiquement en envoyant une ligne vide)
Pour les puristes, | existe toujours, on peut donc ecrire :
get-service | set-content c:\services.txt
(n’essayez pas cette commande, vous n’auriez pas ce que vous souhaitez !)
ou plutôt : get-service | export-csv c:\services.csv
bon, évidemment c’est assez différent de ce que l’on ecrirai en unix et vous allez me dire : "mais c’est super verbeux". Je vous l’accorde – et Microsoft aussi – d’où la notion d’alias qui permettent d’ecrire ceci en lieu et place de la commande précédente :
gsv | epcsv c:\services.csv
Jusque là, mis à part une syntaxe un peu particulière, rien de bien spécial… sauf que… l’exemple n°3 (vous savez celui qui ne marche pas) montre quelque chose de primordial en PowerShell : les résultats des différentes commandes, plutôt que de n’être que du texte qu’il faudra analyser pour pouvoir manipuler, sont de vrais objets. Sur lesquels ils est possible d’appeler des propriétés ou des méthodes.
Le mieux étant de présenter un petit exemple : pour obtenir les processus en cours d’execution, on utilise la commande get-process. Celle-ci vous renvoie, en fait, une liste d’objets System.Diagnostics.Process (oui, oui, l’objet .net), d’ailleurs on peut facilement le vérifier avec la commande for-each (sur laquelle je reviendrai dans un autre billet) : gps | foreach {$_.MainWindowTitle} (affiche le titre de la fenêtre principale pour chaque processus)
Objet .net ai-je dis ? eh oui ! toute la beauté de PowerShell (et certainement le cauchemard des gens de la prod qui auront à l’utiliser), c’est que TOUT est en .net : les commandes, les résultats de celles-ci, les environnements etc.
Du coup pour nous, les développeurs, c’est du bonheur à l’état pur : imaginez les scripts suivants (si vous êtes familier avec .net vous allez aimer)
[DateTime]::Now.AddDays(-5).ToShortDateString()
permet d’obtenir une date cinq jours dans le passé, idéal pour comparer avec la date d’un fichier à archiver…
(new-object Random).next(5000)
permet d’obtenir un chiffre au hasard entre 0 et 5000
Sympa non ?