Powershell – Afficher les commandes de base

I. Présentation

Derrière ce titre anodin, se cache une véritable question de fond. En fait, au fil des versions, au-delà des nombreuses subtilités et amélioration, Microsoft ajoute de nouvelles commandes, qui peuvent passer inaperçues et à mon avis, perturbent sensiblement la fonction d’auto-completion (Via la touche [Tab] 🙂 ).

Par “commandes de base”, j’entends les applets de commande (cmdlet) , fonctions et alias proposés dans le “noyau”. Depuis l’origine, ce noyau est constitué par un composant appelé “Snapin”, que vous pouvez afficher via la commande suivante :

Get-PSSnapin
psh1

get-pssnapin

 

II. Explications

Aujourd’hui, avec Windows 10 – 1607 (Anniversary Update), nous disposons d’un noyau Powershell v5.1. Dont vous pouvez bénéficier dans les versions antérieures sous réserve de mettre à jour le Framework .NET et le package Windows Management Framework 5 (WMF)

Pour rappel, le plus simple pour connaitre la version de Powershell, est d’entrer la commande suivante :

$PSVersionTable
psh2

Exemple $PSVersionTable sous Windows 10 – 1607

 

Pour compter les commandes, il suffit d’entrer la commande suivante :

(Get-Command).count

En Powershell v1, on obtient “129”, puis “236” en v2 mais ça se gâte à partir de la version 3. En effet, avec cette version, Microsoft implémente par défaut le chargement automatique des “extensions”, bien connues sous le nom de “modules“. Autrement dit, le résultat de ce comptage dépend des modules (ou fonctionnalités) déclarés sur la machine client ou serveur. Par exemple, sur un serveur Hyper-V, un contrôleur de domaine, etc, la commande citée précédemment va comptabiliser le tout.

Il est bien sur possible d’identifier les commandes relatives à chaque module à partir la commande suivante :

Get-Command -module NomDuModule

Jusqu’à Powershell v2.0, il faut préalablement charger le module en mémoire pour que l’énumération soit fonctionnelle

… Import-Module NomDuModule

Mais aussi d’énumérer les modules disponibles sur la machine :

Get-Module -ListAvailable

Pour afficher le(s) emplacement(s) où les modules sont recherchés :

"$env:PSModulePath".split(';')

 

Bien, maintenant, comment retrouver nos chères commandes d’un noyau de base ?

La solution peut consister à désactiver (provisoirement ou pas) le chargement automatique des modules, via la commande suivante :

$PSModuleAutoloadingPreference = 'none'
psh3

$PSModuleAutoloadingPreference

Etonnamment, vous pourrez constater que cette variable Powershell n’a pas de valeur “affichable” par défaut, mais il est heureusement possible de réactiver le chargement automatique des modules via la commande suivante :

$PSModuleAutoloadingPreference = 'auto'

Si on fait la même expérience sur un Windows 10 – 1607, on obtient “2729” avec le chargement automatique des modules, contre “330” une fois la valeur désactivée.

 

Pour rendre cette modification permanente dans vos sessions Powershell, vous pouvez recourir à la notion de profil. Pour cela, il vous suffit de créer et/ou modifier ce dernier :

Si vous n’avez pas de profil Powershell personnalisé, entrez la commande suivante :

New-Item -ItemType File $PROFILE -Force

Editez ensuite ce fichier “notepad $PROFILE” puis ajoutez-y la fameuse commande :

$PSModuleAutoloadingPreference = 'none'

 

Et maintenant, pour conclure et afficher, trier ces commandes de base selon les verbes le plus courants :

gcm | group verb | sort count -Descending
psh4

Exemple : Affichage et tri de cmdlet par verbe

Y’a encore de quoi faire, non ?

 

III. Conclusion

Voilà, maintenant que vous savez agir sur le chargement automatique ou non, des modules, vous aurez la possibilité de vous concentrer sur ces fameuses commandes du noyau de base. Rien ne vous empêche d’explorer les autres modules, mais il faudra penser, à l’instar du fonctionnement v2, à charger le(s) module(s) souhaité(s), via la commande “Import-Module”.

Au risque de paraitre rétrograde, je préfère cette seconde option mais cela étant dit, le choix vous appartient.

 

Bonne continuation à tous.

 

 

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.