Le pouvoir de PowerShell, partie 2

Dans la première partie, je vous ai montré quelques astuces que vous pouvez faire avec PowerShell, couvert l'histoire de PowerShell et exploré en détail les fonctionnalités de PowerShell en tant que langage de script performant prenant en charge la programmation procédurale, fonctionnelle et orientée objet.. 

Dans la deuxième partie, je parlerai du shell interactif, du profil et de l’invite, et comparerai PowerShell à Bash..

PowerShell: le shell interactif

Dès le début, PowerShell a été conçu comme un shell interactif pour les administrateurs système Windows et les utilisateurs expérimentés. Il se concentre sur un petit nombre de concepts, très une expérience cohérente et un pipeline d’objets pour chaîner et combiner des commandes, les filtrer et les formater. Son système d'aide puissant, qui adhère également à un format cohérent, est un plaisir à utiliser.

Voyons une partie de cela en action.

Obtenir de l'aide

Le système d’aide complet est accessible via Obtenir de l'aide.

PS C: \ WINDOWS \ system32> Aide Invoke-WebRequest NOM Invoke-WebRequest SYNOPSIS Obtient le contenu d'une page Web sur Internet. SYNTAX Invoke-WebRequest [-Uri]  [-Corps ] [-Certificat ] [-CertificatThumbprint ] [-ContentType ] [- Titulaire ] [-DisableKeepAlive] [-Headers ] [-Dans le fichier ] [-MaximumRedirection ] [-Method Par défaut | Obtenir | La tête | Publier | Put | Supprimer | Trace | Options | Fusionner | Patch] [-OutFile ] [-PassThru] [-Proxy ] [-ProxyCredential ] [-ProxyUseDefaultCredentials] [-SessionVariable ] [-TimeoutSec ] [-TransferEncoding chunked | compresser | dégonfler | gzip | identité] [-UseBasicParsing] [-UseDefaultCredentials] [-UserAgent ] [-WebSession ] [] DESCRIPTION La cmdlet Invoke-WebRequest envoie des demandes HTTP, HTTPS, FTP et FILE à une page Web ou à un service Web. Il analyse la réponse et renvoie des collections de formulaires, liens, images et autres éléments HTML significatifs. Cette cmdlet a été introduite dans Windows PowerShell 3.0. LIENS ASSOCIÉS Version en ligne: http://go.microsoft.com/fwlink/?LinkId=821826 Invoke-RestMethod ConvertFrom-Json ConvertTo-Json REMARQUES Pour afficher les exemples, tapez: "get-help Invoke-WebRequest -examples". Pour plus d'informations, tapez: "get-help Invoke-WebRequest -detailed". Pour des informations techniques, tapez: "get-help Invoke-WebRequest -full". Pour obtenir de l'aide en ligne, tapez: "get-help Invoke-WebRequest -online"

Pour obtenir une aide plus détaillée et voir des exemples, utilisez les commutateurs appropriés: -exemples, -détails, ou -plein.

Si vous n'êtes pas sûr du nom de la commande, utilisez simplement des mots-clés et PowerShell vous montrera toutes les commandes disponibles contenant ce mot-clé. Voyons quelles cmdlets liées à CSV sont disponibles:

PS C: \ Utilisateurs \ the_g> Get-Help - Cmdlet Cmdlet Cmdlet | sélectionnez un nom Nom ---- ConvertFrom-Csv ConvertTo-Csv Export-Csv Import-Csv 

J'ai créé un petit pipeline dans lequel je limitais l'appel Get-Help uniquement à la catégorie Cmdlet, puis je le transmettais au "select" (alias de Select-Object) pour obtenir uniquement la propriété "name".

Travailler avec des fichiers et des répertoires

Vous pouvez faire à peu près tout ce que vous avez l'habitude de faire: naviguer dans différents répertoires, lister les fichiers et les sous-répertoires, examiner le contenu des fichiers, créer des répertoires et des fichiers, etc..

PS C: \ Users \ the_g> mkdir test_dir | sélectionnez le nom Nom ---- test_dir PS C: \ Utilisateurs \ the_g> cd. \ test_dir PS C: \ Utilisateurs \ the_g \ test_dir> "123"> test.txt PS C: \ Utilisateurs \ the_g \ test_dir> ls | nom Nom ----test.txt PS C: \ Utilisateurs \ the_g \ rép_test> get-content. \ test.txt 123

Travailler avec d'autres fournisseurs

Avec PowerShell, vous pouvez traiter beaucoup de choses comme des systèmes de fichiers et les naviguer en utilisant CD et vérifier leur contenu en utilisant ls / dir. Voici quelques fournisseurs supplémentaires:

Magasin de données de disques de fournisseur -------- ----- ---------- Alias ​​Alias: Alias ​​Windows PowerShell Certificat Certificat: certificats x509 pour signatures numériques Environment Env: Variables d'environnement Windows Fonction Fonction: Fonctions Windows PowerShell Registry HKLM :, HKCU: registre Windows Variable Variable: variables Windows PowerShell WSMan WSMan: Informations de configuration de WS-Management 

Examinons l'environnement et voyons quelles variables d'environnement liées à Go sont présentes (sur ma machine):

PS C: \ Utilisateurs \ the_g> ls env: GO * Nom Valeur ---- ----- GOROOT C: \ GO \ GOPATH C: \ Utilisateurs \ the_g \ Documents \ Go 

Mise en forme

PowerShell encourage la composition d'applets de commande avec des commutateurs standard et la création de pipelines. Le formatage est un concept explicite dans lequel vous mettez un formateur à la fin d'un pipeline. PowerShell examine par défaut le type d’objet ou d’objets à la fin du canal et applique un formateur par défaut. Mais vous pouvez le remplacer en spécifiant vous-même un formateur. Les formateurs ne sont que des cmdlets. Voici la sortie précédente affichée sous forme de liste:

PS C: \ Utilisateurs \ the_g> ls env: GO * | Nom de la liste de formats: GOROOT Valeur: C: \ Go \ Nom: GOPATH Valeur: c: \ Utilisateurs \ the_g \ Documents \ Go 

Le profil

Les utilisateurs expérimentés qui utilisent la ligne de commande ont souvent de nombreuses tâches, pipelines et combinaisons de commandes préférées avec les commutateurs par défaut qu'ils préfèrent. Le profil PowerShell est un fichier de script PowerShell qui est chargé et exécuté chaque fois que vous démarrez une nouvelle session. Vous pouvez y mettre tous vos objets préférés, créer des alias et des fonctions, définir des variables d'environnement et à peu près tout le reste..

J'aime créer des alias de navigation vers des répertoires profondément imbriqués, activer des environnements virtuels Python et créer des raccourcis vers des commandes externes que j'exécute fréquemment, comme git et docker..

Pour moi, le profil est indispensable car les commandes et les commutateurs très lisibles et cohérents de PowerShell sont souvent trop explicites, et les alias intégrés posent souvent plus de problèmes que d’aide (j’en discuterai plus tard). Voici un extrait très partiel de mon profil:

# --------------------------- # # DOCKER # # ----------------- ---------- Set-Alias ​​-Name d -Value docker function di d images # ------------------------ --- # # GIT # # --------------------------- Set-Alias ​​-Name g -Value git function gs g status fonction gpu g pull --rebase # ------------------------- # # CONDA # # ---------- --------------- fonction a activate.ps1 $ args [0] # ---------------------- - # # NAVIGATION # # ------------------------ function cdg cd $ rép_github # MVP function cdm a ov; cdg; cd MVP # fonction backend cdb a ov; cdg; cd backend # scratch function cds a ov; cdg; cd scratch # backend packages fonction cdbp cdb; cd packages # Fonction de travail Go Go cdgo cd $ go_src_dir

L'invite 

PowerShell vous permet de personnaliser votre invite de commande. Vous devez définir une fonction appelée rapide(). Vous pouvez voir la fonction d’invite intégrée:

PS C: \ Utilisateurs \ the_g> fonction gc: invite "PS $ ($ executionContext.SessionState.Path.CurrentLocation) $ ('>' * ($ nestedPromptLevel + 1))"; # .Link # http://go.microsoft.com/fwlink/?LinkID=225750 # .ExternalHelp System.Management.Automation.dll-help.xml PS C: \ Utilisateurs \ the_g> 

Voici une fonction d'invite personnalisée qui affiche l'heure actuelle en plus du répertoire actuel:

PS C: \ Utilisateurs \ the_g> invite de fonction "$ (get-date) $ (get-location)>"

10/09/2016 12:42:36 C: \ Users \ the_g> 

Bien sûr, vous pouvez vous déchaîner, ajouter des couleurs et vérifier diverses conditions, par exemple si vous vous trouvez dans un référentiel git particulier ou si vous êtes administrateur..

Alias: le côté obscur

PowerShell s'est trompé de pseudonyme, à mon avis, sur deux fronts distincts. Premièrement le alias commande permet uniquement de renommer des commandes. Vous ne pouvez pas ajouter d’indicateurs ni d’options communes pour rendre les commandes plus utiles en les aliasant entre elles..

Par exemple, si vous voulez chercher dans le texte ligne par ligne, vous pouvez utiliser le Chaîne de sélection cmdlet:

# Créez un petit fichier texte avec 3 lignes "@ ab cd ef @"> 1.txt # Recherchez une ligne contenant d Get-Content 1.txt | Select-String d cd

Cela fonctionne, mais beaucoup de gens aimeraient renommer Chaîne de sélection à grep. Mais grep est par défaut sensible à la casse, alors que Chaîne de sélection n'est pas. Pas de problème, nous ajouterons simplement le -Sensible aux majuscules et minuscules drapeau, comme dans:

Set-Alias ​​-Name grep -Value "Select-String -CaseSensitive" 

Malheureusement, cela ne fonctionne pas:

16:19:26 C: \ Users \ the_g> Get-Content 1.txt | grep D grep: le terme 'Select-String -CaseSensitive' n'est pas reconnu comme nom d'une applet de commande, d'une fonction, d'un fichier de script ou d'un programme utilisable. Vérifiez l'orthographe du nom ou, si un chemin a été inclus, vérifiez que le chemin est correct et réessayez. À la ligne: 1 caractère: 21 + Get-Content 1.txt | grep D + ~~~~ + CategoryInfo: ObjectNotFound: (Select-String -CaseSensitive: String) [], CommandNotFoundException + FullyQualifiedErrorId: CommandNotFoundException. 

La valeur d'un alias doit soit une applet de commande, une fonction, un script ou un programme. Aucun drapeau ou argument n'est autorisé. 

Vous pouvez le faire très facilement dans PowerShell, mais vous devrez utiliser des fonctions et non des alias. Cela contraint les pseudonymes à un simple changement de nom, ce qui peut également être fait par des fonctions.

PowerShell contre Bash

Du côté du shell interactif, PowerShell et Bash sont assez égaux. Bash est plus concis par défaut, mais le pipeline d'objets de PowerShell permet de gérer plus facilement des pipelines complexes.. ,

Cela dit, vous pouvez probablement tout accomplir avec l'un ou l'autre et si vous êtes un utilisateur expérimenté, vous aurez vos propres alias, fonctions et raccourcis pour les tâches courantes. En ce qui concerne les scripts, PowerShell va bien au-delà de Bash et bat même Python, Ruby et ses amis pour les besoins de l'administration système.. 

Un aspect important est la disponibilité. Bash est livré pré-installé avec la plupart des distributions * nix (à moins que celles-ci aient été spécifiquement supprimées), y compris macOS. Il peut également être installé sur Windows via cygwin, git-bash ou msys. PowerShell est préinstallé sur Windows et est disponible depuis peu sur Mac et Linux..

Conclusion

Si vous utilisez Windows comme machine de développement ou si vous gérez des machines Windows, PowerShell est un outil indispensable. C’est vraiment un super ensemble bien pensé des coques Unix, et il est livré pré-installé. 

PowerShell est un excellent logiciel d'ingénierie au travail. Il a évolué au cours d'une décennie et continue d'innover tout en maintenant son intégrité conceptuelle d'origine. Le récent passage à l’open source et à la multiplication des plates-formes montre qu’il reste encore beaucoup à attendre..