« Name Spaces » et « Type Name Accelerators » sous PowerShell
PowerShell est l’outil qui aide les administrateurs à gagner du temps.
C’est le « couteau suisse » qui leur permet, via la console (le Shell) ou via le développement de scripts, de répondre rapidement à un besoin identifié et d’automatiser des tâches quotidienne d’administration : Supervision, sauvegarde, maintenance, audit, script de connexion, déploiement, etc… Il permet donc d’augmenter sa productivité mais surtout, de ne pas avoir à effectuer des tâches manuellement, répétitives et finalement rébarbatives
Par définition, un administrateur n’est pas un développeur. Et c’est souvent là qu’est la difficulté : celle de comprendre où se situe la limite entre ces 2 types de profils. Il est parfois nécessaire de franchir la frontière qui sépare ces deux mondes (c’est vrai dans les 2 sens, mais ce n’est pas le but de cet exposé).
Car, bien que les nouvelles évolutions apportées dans la version 3 de PowerShell permettent d’accéder à un nombre encore plus important de nouvelles fonctionnalités (Features, Modules, Cmdlets, …), l’administrateur est parfois (souvent ?) contraint de devoir parcourir le MSDN afin d’identifier les espaces de noms, classes, méthodes et propriétés qui lui permettront de parvenir à ses fins.
Le plus important est de comprendre que PowerShell est orienté objet et qu’il s’appuie sur le .Net FrameWork.
- Qu’est ce que « orienté objet » signifie, dans le monde de la programmation ?
Reprenons simplement une partie de la définition du Wikipédia : « … Un objet représente un concept, une idée ou toute entité du monde physique, comme une voiture, une personne ou encore une page d’un livre. Il possède une structure interne et un comportement, et il sait communiquer avec ses pairs. Il s’agit donc de représenter ces objets et leurs relations ; la communication entre les objets via leurs relations permet de réaliser les fonctionnalités attendues, de résoudre le ou les problèmes. ».
PowerShell permet de créer et de manipuler des objets dans le but d’interagir avec le système.
On peut trouver sur Internet une multitude d’articles qui expliquent simplement, par des exemples, en quoi PowerShell est orienté objet :
Laurent Dardenne – La notion d’objet sous PowerShell
Doug Finke – How to practice PowerShell
- Qu’est ce que le « .Net Framework » ?
Il s’agit d’une plateforme structurelle et organisée, fournie par l’éditeur Microsoft, qui permet de définir une base de travail commune à tous. Il aide les développeurs dans leur travail de développement de programmes et de logiciels qui pourront ensuite être utilisés sous environnement Windows.
PowerShell a été développé en suivant ce modèle. Mieux encore, PowerShell permet d’accéder aux espaces de noms définis dans le .Net Framework, le rendant encore plus riche et puissant.
- Comment explorer les Classes du .Net Framework accessibles depuis PowerShell ?
Vous trouverez sur le blog du Scripting Guy « Hey, Scripting Guy ! Blog » un article récent, très intéressant qui explique comment lister les classes déjà chargées sous PowerShell. La liste est longue !
PS C:\> [appdomain]::currentdomain.GetAssemblies() |
Foreach-Object {$_.gettypes()} |
Sort-Object basetype |
Out-File -FilePath D:\gettypes.txt -Width 180 –Append
Plus de 10 000 lignes sont alors référencées dans le fichier « gettypes.txt ».
La colonne ‘Name’ indique le nom de l’objet dans PowerShell et la colonne ‘BaseType’ indique la classe auquel il se rapporte.
Par exemple, PowerShell permet de manipuler des fichiers et des répertoires. Il utilise pour cela l’espace de nom « System.IO ». D’ailleurs, si vous utilisez la Cmdlet « Get-ChildItem » pour lister les fichiers et répertoires présents dans une arborescence donnée, cette commande vous renvoie des objets du type « System.IO.FileInfo » et/ou « System.IO.DirectoryInfo ». Pour le voir, il suffit d’utiliser la Cmdlet « Get-Member » :
PS C:\> Get-ChildItem C:\Windows\System32 | Get-Member
Cette commande nous renvoie 2 ‘TypeName’ qui sont « System.IO.DirectoryInfo » et « System.IO.FileInfo ».
Ci-après une commande qui vous permettra de récupérer la liste des classes issues de l’espace de nom « System.IO » et déjà chargées dans PowerShell (V2) :
PS C:\> [appdomain]::currentdomain.GetAssemblies() |
Foreach-Object {$_.gettypes()} |
Sort-Object basetype |
Where-Object{$_.BaseType -like "System.IO*"}
Il suffit ensuite d’aller sur le site du MSDN afin d’effectuer une recherche.
Voici la définition de l’espace de nom « System.IO » sur le MSDN.
Utiliser simplement le champ de recherche, en haut à gauche, afin de trouver des informations sur l’espace de noms recherché.
- Comment accéder rapidement à des classes du .Net Framework :
PowerShell met à notre disposition des raccourcis (d’écriture) nommés « Type Name Accelerators ».
Ces raccourcis permettent d’accéder rapidement à des classes du .Net Framework.
A la lecture de cet article, on comprend alors comment récupérer une liste exhaustive de ces raccourcis.
Voici la liste des « Type Accelerators », sous PowerShell V2 :
Dans ce code, nous avons publié un nouveau « Type Accelerator » qui pointe sur la classe « System.Management.Automation.TypeAccelerators » et l’avons nommé « Accelerators » (voir dernière ligne du résultat : il est effectivement listé).
Remarque : Dans une nouvelle session PowerShell, « [Accelerators] » aura disparu. Si nous souhaitons le conserver, pour une utilisation future, il faut donc ajouter ce code dans l’un des profils PowerShell.
Ce code peut également s’écrire en une seule ligne :
PS C:\> [psobject].assembly.gettype("System.Management.Automation.TypeAccelerators")::Get
Nous pouvons noter ici l’utilisation d’un autre accélérateur / raccourci : [psobject] .
Une autre remarque concernant l’espace de noms « System.Management.Automation », visible pour plusieurs de ces raccourcis. Il est la base sur laquelle repose PowerShell : « This is the root namespace for Windows PowerShell. It contains classes, enumerations, and interfaces. For example, cmdlet developers will use the Cmdlet and PSCmdlet base classes to implement custom cmdlet classes, and host application developers will use the PowerShell class to create runspaces and invoke commands. ».
On peut donc utiliser ces accélérateurs afin de typer (« cast ») une valeur. Ci-après quelques exemples :
Dans le premier cas, nous avons généré un objet de type entier (Int32) et dans le second cas, il s’agit d’une chaîne de caractère.
Nous avons donc bien typé la valeur « 128 », qui par défaut, serait un entier, sauf si nous avions précisé les guillemets :
Même en précisant les guillemets, nous pouvons « forcer » le type entier :
Dans ce dernier cas, nous avons transformé l’objet « System.String » en « System.int32 ».
L’essentiel ici est de comprendre qu’il est bien plus rapide de saisir [int] en lieu et place de [system.int32] et [string] pour [system.string].
D’autres « alias » sont particulièrement intéressants, comme [wmisearcher], [adsisearcher] ou bien encore [regex] :
PS C:\> ([wmiSearcher]'SELECT * FROM Win32_Printer where Name="PDFCreator"').Get()
Dans cet exemple, on récupère un objet WMI qui correspond à l’imprimante nommée « PDFCreator » et issu de la classe WMI « Win32_Printer ».
PS C:\> ([adsisearcher]"objectcategory=user").FindAll()
Dans cet exemple, on recherche tous les objets ‘User’ du domaine Active Directory courant.
Pour l’utilisation de [Regex], un exemple est donné dans un précédent article « Lire un log DNS via PowerShell ».
Pour conclure, un administrateur n’a pas besoin de savoir que [regex] est un raccourci issu de la classe du .Net Framwork « System.Text.RegularExpressions.Regex » pour pouvoir travailler avec les expressions régulières sous PowerShell.
Toutefois, cela lui permet de mieux comprendre comment PowerShell fonctionne et interagit avec le Système, de parfaire ses connaissances et d’améliorer ses compétences, donc d’aller encore plus loin dans l’utilisation quotidienne de PowerShell… Bref, de gagner encore du temps
Un article très intéressant sur les « Raccourcis de type », sur le blog de benduru : http://posh.netau.net/2012/05/creer-des-raccourcis-de-type-type-accelerators-en-powershell/
Une fonction PowerShell qui permet de charger un assembly dans le GAC, sans passer par gacutil : http://powershell-scripting.com/index.php?option=com_joomlaboard&Itemid=76&func=view&id=11839&catid=14 (publication de Laurent Dardenne dans les contributions du Forum de http://www.powershell-scripting.com)
Bonjour Matthew
>>Comment accéder rapidement à des espaces de noms :
>>PowerShell met à notre disposition des raccourcis nommés « Type Name Accelerators ».
A mon avis il y a un décalage entre le nom du paragraphe et le nom anglais que tu cites.
C’est un type, un nom de classe, que l’on pointe pas un espace de nom (namespace).
>>Dans une nouvelle session PowerShell, « Accelerators »
Sur la forme, à mon avis, [Accelerators] eut été préférable.
Ensuite la notion d’accélérateur ‘enrichi’ le vocabulaire du langage, car le parseur les reconnait sans broncher. C’est un des aspects d’un langage dynamique.
>>On peut donc utiliser certains de ces accélérateurs afin de typer (« cast ») une valeur :
Pour moi on peut tous les utiliser sur un objet, c’est le résultat qui va déterminer, par rapport à l’objet ‘associé’, le « certains ». Je te laisse faire la démonstration
Concernant l’usage de raccourcis, il s’agit surtout d’un raccourcis d’écriture, sa présence et usage peut ne pas être liè à une opération de transtypage (cast).
On peut par exemple crée un raccourcis sur une classe d’attribut de validation créé en C#.
Concernant la définition de Powershell, est-il orienté objet ou basé objet ? Le paragraphe ‘Principes’ du lien que tu cites sur Wikipédia, est sujet à discussion…
Surtout qu’il manque le mot ‘Programmation’ dans le titre « Qu’est ce que « orienté objet » signifie ? ».
Voici une définition de Jeffrey Snoover, extrait d’une de ces dernières présentation (je n’ai pas mémorisé le lien) :
»
PowerShell is NOT a CLI or a Shell : PowerShell is a distributed automation engine with a CLI and a Shell
Distributed automation engine exposed as:
-An interactive shell
-A scripting language
-An API
-A remoting interface
•Cmdlets
•Coverage is king
-WMI, WSMAN, COM, .Net, ADSI, XML, native code …
-Common Engineering Criteria
-3rd party support
»
Est-ce que cette notion d’objet est, pour lui importante ou pas ? C’est à lui qu’il faudrait poser la question, voir poser la même à Bruce Payette
Bonjour Laurent,
Merci beaucoup pour ton message et ces éclaircissements !
J’ai pris en compte tes remarques et j’ai apporté quelques modifications à l’article.
Je pense effectivement qu’il serait (sera) très intéressant de poser des questions à l’équipe en charge du développement de PowerShell ainsi qu’aux personnes qui en sont à l’origine
@ bientôt