Le pouvoir de PowerShell, première partie

PowerShell est un shell interactif et un langage de script de Microsoft qui repensent ce qu'est un shell de commandes. Il a des capacités très intéressantes au-delà des shells Unix, et il existe un puissant écosystème et une communauté. 

Dans ce didacticiel en deux parties, vous apprendrez certaines des choses intéressantes que vous pouvez faire avec PowerShell, son histoire, son architecture, ses concepts et sa comparaison avec un shell Unix tel que Bash. Préparez-vous pour un voyage passionnant!

Installation de PowerShell

Si vous utilisez Windows 10, vous pouvez continuer. Sinon, téléchargez-le sur le site Web de Microsoft.

Une fois que PowerShell est installé, la première chose à faire est d'activer l'exécution du script. Lancez PowerShell en tant qu'administrateur et tapez: Set-ExecutionPolicy RemoteSigned. Vous devez le faire juste une fois. Maintenant, mettez à jour les fichiers d'aide: Update-Help -Force.

Des choses cool à faire avec PowerShell

Commençons par une démonstration rapide de l’étendue et de la profondeur de PowerShell. Ceci est juste une liste quelque peu arbitraire pour ouvrir votre appétit. Ce n'est pas exhaustif, et ce ne sont pas nécessairement les choses les plus impressionnantes que vous puissiez faire avec PowerShell..

Lire des vidéos

Voici un one-liner pour lire des fichiers vidéo (ou n’importe quel fichier multimédia):

(New-object -COM WMPlayer.OCX) .openPlayer ("Chemin d'accès à votre vidéo")

Il va ouvrir une fenêtre de lecteur multimédia et commencer à jouer votre vidéo immédiatement.

Ici les cordes

PowerShell propose l'une des solutions les plus lisibles et les plus agréables visuellement aux chaînes multilignes, AKA "here strings". Vous venez de commencer avec @ " et se termine par "@. Notez que les marqueurs de début et de fin doivent être sur leur propre ligne, séparément du contenu situé entre les deux. Voici un exemple:

$ x = "@ 123 456 789 @"

Générer des nombres aléatoires

Choisissez un nombre aléatoire compris entre 1 et 100:

1… 50 | Obtenir au hasard

C'est un pipeline simple. Le côté gauche peut générer tous les entiers de 1 à 50 (inclus), puis il est envoyé à l'applet de commande Get-Random qui en sélectionne un..

Travailler avec le presse-papier

PowerShell prend en charge le Presse-papiers en profondeur. Vous pouvez obtenir et définir des objets de différents formats. De toute évidence, le texte brut est possible, mais vous pouvez également travailler avec des images, HTML, RTF et même des fichiers..

Ici, je sélectionne des fichiers dans l'explorateur, puis je les récupère dans le Presse-papiers de PowerShell:

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

Parler

PowerShell peut aussi parler!

Add-Type -AssemblyName System.speech $ synth = Nouvel objet -TypeName System.Speech.Synthesis.SpeechSynthesizer $ synth.Speak ("PowerShell aux personnes")

Obtenir toutes les machines virtuelles en cours d'exécution

Voici un petit pipeline pour répertorier toutes les machines virtuelles en cours d’exécution:

Get-VM | Where-Object $ _. State -eq "En cours d'exécution"

Afficher la barre de progression

PowerShell peut afficher une belle barre de progression lors de longues opérations. Voici un exemple qui calcule de manière récursive la taille totale de tous les fichiers du répertoire actuel:

$ files = Get-ChildItem. -Recurse $ total = 0 Pour ($ i = 1; $ i -le $ fichiers.Compte-1; $ i ++) Write-Progress -Activity "Calcul de la taille totale…" -status $ fichiers [$ i] .Nom - PercentComplete ($ i / $ files.Count * 100) $ total + = $ fichiers [$ i]. Longueur début-veille-millisecondes 50 Écriture-hôte "Taille totale: $ ($ total / 1 Mo)" 

Histoire de PowerShell

PowerShell 1.0 est sorti en 2006, mais son inventeur Jeffery Snover a commencé à travailler dessus beaucoup plus tôt. Consultez le manifeste de 2002. PowerShell a parcouru un long chemin. Windows était très en retard en termes d'installations en ligne de commande. Les administrateurs système et les utilisateurs expérimentés devaient se contenter des maigres offres de cmd.exe et de fichiers de traitement par lots. Quelques tentatives infructueuses visant à améliorer la situation avec des hôtes de script Windows autorisant l'utilisation de scripts pour des objets système à l'aide de VBScript ou de JScript ont été effectuées, mais cette approche a posé de nombreux problèmes..

PowerShell a changé tout cela et très rapidement. Cela ne correspond pas seulement aux capacités de ligne de commande des environnements * nix, mais également à de nombreuses innovations, à une cohérence sans précédent et à une facilité d'utilisation sans faille..

Aujourd'hui, PowerShell est à la version 5.1. Au fil des années et des versions, les capacités et les environnements d'hébergement de PowerShell ont considérablement augmenté. 

PowerShell 1.0 administration locale prise en charge des machines Windows (y compris Windows Server 2003).

PowerShell 2.0 a été intégré à Windows 7 et Windows Server 2008 R2. Il a ajouté la prise en charge de la communication à distance et considérablement augmenté les capacités de PowerShell avec des tâches en arrière-plan, des transactions, des événements, le débogage, un environnement de développement d'interface graphique et de nombreuses nouvelles applets de commande..

PowerShell 3.0 a été publié dans le cadre de la structure de gestion Windows. Il a été installé sur Windows 8 et Windows Server 2012. Il a ajouté des tâches planifiées, la connectivité de session, le chargement automatique de modules et de nombreuses nouvelles commandes..

PowerShell 4.0 a été intégré à Windows 8.1 et Windows Server 2012 R2. Il a ajouté la prise en charge de la configuration de l’état souhaité, du débogage amélioré, des diagnostics réseau et de la -PipelineVariable commutateur.

PowerShell 5.0 a été publié dans le cadre de la structure de gestion Windows 5. PowerShell 5.1 a été publié dans le cadre des mises à jour Windows 10 anniversaires. Les nouvelles fonctionnalités comprennent les définitions de classe PowerShell, les énumérations .NET, les travaux de débogage et de débogage à distance, le gestionnaire de configuration local DSC et de nombreuses autres améliorations DSC..

PowerShell: le langage de script

PowerShell est un langage de programmation très puissant. Bien sûr, il peut exécuter des scripts, mais il dispose également de mécanismes plus avancés tels que des modules, des applets de commande personnalisées et des classes. PowerShell est un langage multi-paradigmes prenant en charge les paradigmes orientés objet, fonctionnels et procéduraux.. 

Cependant, l’aspect le plus important de PowerShell est qu’il s’agit d’un langage .NET à part entière. Il crée et utilise des objets d'assemblages .NET programmés dans n'importe quel langage et les objets transitant par le pipeline de PowerShell sont des objets .NET. PowerShell est également fortement typé, mais vous pouvez l’ignorer quand vous le souhaitez et vous n’aurez pas à spécifier les types si vous ne le souhaitez pas..

Script de procédure

Pour programmer de manière procédurale, vous avez besoin de fonctions, de conditions et de boucles. PowerShell a tout cela. Les opérateurs de comparaison risquent de vous surprendre car ils n'utilisent pas les symboles habituels. Au lieu de cela vous avez: -eq (égal), -lt (moins que), -gt (plus grand que), -ge (supérieur ou égal), etc.. 

Voici un exemple de logique conditionnelle qui obtient une entrée de l'utilisateur et vérifie sa validité. Notez l'utilisation de la -comme opérateur pour essayer de convertir l’entrée en un entier. Si cela échoue, le résultat est $ null.

$ value = 44 $ in = Read-Host "Devinez un nombre compris entre 1 et 100" $ suppose = $ dans -as [int] if ((($ suppose -eq $ null) -or ($ suppose -lt 1)) -or ($ suppose -gt 100)) Write-Host "$ suppose n'est PAS un entier compris entre 1 - 100" Quitter if ($ suppose-$ valeur -eq $ valeur) Write-Host "You Win!"  elseif ($ suppose -lt $ valeur) Write-Host "trop ​​bas" else Write-Host "trop ​​élevé" 

PowerShell dispose de nombreuses installations et applets de commande permettant de travailler avec des collections et de les couper en dés, de sorte que les boucles ne sont pas souvent nécessaires. Mais, au cas où vous seriez si enclin à le faire, PowerShell contient de nombreuses constructions en boucle. Vous pouvez utiliser des boucles For, des boucles ForEach, des boucles While, des boucles Do-While et même des boucles spéciales ForEach-Object. Voici quelques exemples.

Pour ($ i = 0; $ i -lt 100; $ i + = 20) $ i 0 20 40 60 80 $ list = 1… 5 ForEach ($ item dans $ list) $ item * 3 3 6 9 12 15 $ plus tard = $ (Get-Date) .AddSeconds (5) tandis que ($ (Get-Date) -lt $ plus tard) "Sommes-nous encore là?" sommeil 1 PS C: \ WINDOWS \ system32> $ later = $ (Get-Date) .AddSeconds (5) while ($ (Get-Date) -lt $ later) "Sommes-nous encore là?" dormir 1 Sommes-nous là? Sommes-nous déjà là? Sommes-nous déjà là? Sommes-nous déjà là? Sommes-nous déjà là?

Programmation fonctionnelle

PowerShell concerne la programmation fonctionnelle. Le pipeline est un environnement d’exécution fonctionnel dans lequel vous composez des fonctions / des applets de commande de manière dynamique. Vous pouvez le faire de manière interactive ou dans un script. Si vous voulez faire de la programmation fonctionnelle explicite, vous pouvez le faire aussi, mais la syntaxe est un peu lourde. Consultez cet article: Programmation fonctionnelle dans PowerShell.

Programmation orientée objet

Vous avez déjà vu comment utiliser les objets .NET et les objets passant par le pipeline. Définissons une classe dans PowerShell et effectuons quelques opérations d’exploitation de base. Je crée ici une classe pour un personnage de jeu doté de santé et d'une armure pouvant subir des dégâts et calculer sa santé. Il y a aussi un Est vivant() méthode qui vérifie si santé> 0. J'utilise un constructeur. 

Notez que vous devez instancier les classes PowerShell à l'aide de []::Nouveau(). La syntaxe New-Object n'est pas prise en charge à partir de PowerShell 5.1..

class Character [chaîne] $ Nom [int] $ Santé [int] $ AttackDamage [float] $ Caractère Armor ([chaîne] $ name, [int] $ santé, [int] $ attackDamage, [float] $ armor)  $ this.Name = $ name $ this.Health = $ santé $ this.AttackDamage = $ attackDamage $ this.Armor = $ armor [bool] IsAlive () return $ this.Health -gt 0 [void] TakeDamage ( [int] $ dégâts) if ($ this.armor -gt 0) $ dégâts = $ dégâts - 0.4 * $ this.Armor * $ dégâts $ this.Health - = $ dégâts $ c = [Caractère] :: new ("xxx", 50, 10, 1.0) $ c.TakeDamage (20) $ c.IsAlive () Vrai $ c.Santé 38 $ c.TakeDamage (40) $ c.Santé 14 $ c.TakeDamage ( 40) $ c.Santé -10 $ c.IsAlive () Faux 

Vous pouvez même faire un héritage si vous le souhaitez, mais j'estime qu'à ce stade, vous devriez probablement utiliser un autre langage..

Environnement de script interactif

PowerShell est livré avec son propre IDE pour le développement de scripts qui comprend une fenêtre interactive, plusieurs onglets pour les scripts avec complétion de code, une aide intégrée sur toutes les applets de commande et bien plus encore. C'est un outil très astucieux, et je vous recommande de l'essayer.

Conclusion

Vous avez maintenant vu les capacités de PowerShell en tant que langage de script et en avez appris un peu plus sur ses objectifs de conception et son historique. Dans la deuxième partie, je traiterai en détail des aspects interactifs de PowerShell..