Windows PowerShell : Tous les chemins mènent aux objets personnalisés

Peu importe vraiment quelle approche que vous choisissez pour sortie des objets personnalisés, comme un objet personnalisé est votre résultat final.

Don Jones

Récemment, j'ai écrit un blog qui décrit un ensemble de 12 meilleures pratiques pour l'utilisation de Windows PowerShell. L' No. 12 meilleures pratiques dirige les gens à la sortie des objets provenant de leurs textes et leurs fonctions, au lieu de sortie de texte. Je suis allée jusqu'à laisser entendre que si vous utilisiez jamais la cmdlet Write-Host, vous devriez prendre du recul et réfléchir à ce que vous faisiez. Tous les Write-Host est est produire le texte.

Peu de temps après que ce poste n'est pas allé en direct, un lecteur m'a contacté sur le code que j'avais utilisé pour créer effectivement l'objet personnalisé. Il a dit qu'il n'avait jamais vu cette approche avant. C'est étonnant, comme Windows PowerShell semble offrir une douzaine de façons de faire quelque chose. Il a suggéré que j'écris un article sur les différentes façons de produire un objet personnalisé, si nous sommes ici.

Le mode plein-formulaire

Il s'agit de la façon dont la plupart des gens seraient probablement choisir pour créer un objet personnalisé. C'est ce que j'appelle le « approche manuel ». Il a l'avantage d'être assez évident, bien qu'il faut beaucoup de typage. En supposant que j'ai un objet dans le système d'exploitation $ variable et un autre dans le bios $, je pouvais combiner des morceaux choisis de l'information d'eux comme ceci :

$object = New-Object –TypeNamePSObject
$object | Add-Member –MemberTypeNoteProperty –Name OSBuild –Value $os.BuildNumber
$object | Add-Member –MemberTypeNoteProperty –Name OSVersion –Value $os.Version
$object | Add-Member –MemberTypeNoteProperty –Name BIOSSerial –Value $bios.SerialNumber
Write-Output $object

Vous pouvez continuer ce schéma pour ajouter toutes les informations dont vous avez besoin à l'objet de la sortie finale, avant d'écrire dans le pipeline.

-Relais : Un bref raccourci

Vous pouvez faire cette première approche un peu plus concise en disant Add-membre de remettre l'objet dans le pipeline :

$object = New-Object –TypeNamePSObject
$object | Add-Member –MemberTypeNoteProperty –Name OSBuild –Value $os.BuildNumber –PassThru |
Add-Member –MemberTypeNoteProperty –Name OSVersion –Value $os.Version –PassThru |
Add-Member –MemberTypeNoteProperty –Name BIOSSerial –Value $bios.SerialNumber
Write-Output $object

Lorsque vous terminez une ligne avec un caractère pipe, Windows PowerShell sait aller à la ligne physique pour chercher la commande suivante dans le pipeline. Essentiellement, c'est un moyen de briser une commande longue en plusieurs lignes physiques. Cette astuce, combiné avec le commutateur –PassThru, cela fait une série de trois commandes distinctes.

Hashtable une Go-Go

Alors que les approches précédentes sont efficaces, ils sont également très verbeuses. Dans un script, il peut être difficile pour vous de déterminer visuellement ce qui se passe. À l'aide de la fonctionnalité de New-Object est une approche plus concise. Cela vous permet de créer une table de hachage (ou un tableau associatif) qui contient les noms de propriétés et les valeurs que vous souhaitez ajouter à l'objet nouvellement créé. Ces propriétés sont chacun créées automatiquement comme une NoteProperty :

$properties = @{'OSBuild'=$os.BuildNumber;
                'OSVersion'=$os.version;
                'BIOSSerial'=$bios.SerialNumber}
$object = New-Object –TypeNamePSObject –Prop $properties
Write-Output $object

Cela a le même effet, mais il est beaucoup plus concis. Certaines gens intelligents utilisera une expression entre parenthèses pour le rendre encore plus courtes. Cependant, je pense que cela le rend un peu plus difficile à lire :

$object = New-Object –TypeNamePSObject –Prop
(@{'OSBuild'=$os.BuildNumber;
                'OSVersion'=$os.version;
                'BIOSSerial'=$bios.SerialNumber})
Write-Output $object

Aller un peu plus loin

Vous remarquerez que dans tous ces exemples, sauvegarder l'objet personnalisé à une variable (objet$) avant d'écrire dans le pipeline. La raison en est simple. Vous pouvez manipuler l'objet un peu plus. Par exemple, vous pouvez donner votre objet un nom de type personnalisé :

$object.PSObject.TypeNames.Insert(0,'My.Custom.Name')

Cela vous permet de créer un défaut personnalisé mise en page pour afficher votre objet de mise en forme. J'ai utilisé cette astuce à grand effet dans "Windows PowerShell Scripting et taillanderie" (concentré de technologie et de formation technique de l'Interface, 2011), un bref ouvrage que j'ai écrit qui met l'accent sur les choses telles que l'utilisation des objets personnalisés en sortie d'outils sur mesure de Windows PowerShell.

Traits différents pour différents Folks

Il n'y a aucun moyen de « mauvais » de faire n'importe quoi dans Windows PowerShell, aussi longtemps que votre approche obtient le travail. Cela dit, il y a certaines approches éviter, surtout parce qu'ils sont moins lisibles et plus difficiles à enseigner — surtout pour les nouveaux arrivants. En voici un, encore en supposant que mon os $ variables et $ du bios contiennent les objets brutes, de que je tiens à extraire de l'information :

$os | Select-Object –Property @{n='OSVersion';e={$_.Version}},
@{n='OSBuild';e={$_.BuildNumber}},
@{n='BIOSSerial';e={$bios.SerialNumber}}

Vous allez générer les mêmes résultats que les exemples précédents, mais la syntaxe est épouvantable. Il y a beaucoup de ponctuation, beaucoup de structure et vous devez comprendre beaucoup qu'accomplit Select-Object avec ces trois tables de hachage.

Il est fondamentalement générant des propriétés personnalisées à l'aide d'une syntaxe unique à cette cmdlet (et partagée par les cmdlets de Format). Vous verrez cette syntaxe utilisée par des gens avec un fond de développement-style de logiciels. Il est plus difficile pour moi (et beaucoup d'autres gens) mentalement à analyser, donc j'ai tendance à n'utiliser pas autant.

PowerShell n'est rien si pas Flexible

Windows PowerShell est unique en ce qu'il vous permet de faire quelques trucs dingues. Par exemple, revenir à mon exemple de hashtable. Vous pourrait également faire de cette façon :

$info = @{}
$info.OSBuild=$os.BuildNumber
$info.OSVersion=$os.version
$info.BIOSSerial=$bios.SerialNumber
$object = New-Object –TypeNamePSObject –Prop $info
Write-Output $object

Vous êtes créant un hashtable vide, puis ajouter de l'information en se référant aux propriétés qui n'existent pas. Lorsque vous tentez d'abord accéder à OSBuild, par exemple, Windows PowerShell réalise qu'aucune de ces biens n'existe dans l'objet d'info $ (qui était un hashtable vide). Implicitement, il crée la propriété et affecte votre valeur. Trucs dingues — mais ça fonctionne.

Les peuplements morales : Les objets, non texte

Toutefois vous choisissez de créer des objets personnalisés, vous pouvez créer des objets personnalisés plutôt que de la sortie de texte simple à la fenêtre de console. Les objets sont infiniment plus souples, et qu'ils ont laissé à votre sortie de script ou de la fonction intégrer avec tout autre Windows PowerShell.

Don Jones

Don Jones est un Microsoft MVP lauréat du prix de l'auteur de "Apprendre Windows PowerShell dans un mois de déjeuners" (Publications Manning, 2011), un livre conçu pour aider tout administrateur à devenir efficace avec Windows PowerShell. Jones offre également une formation de Windows PowerShell publique et sur place. Communiquer avec lui par le biais de son site Web à ConcentratedTech.com.

Contenu connexe