Windows PowerShell : Syntaxe express

En général, nombreuses sont les manières de faire la même chose dans Windows PowerShell. Trouvez celle qui vous convient et ne la lâchez plus.

Don Jones

Une des choses que j'aime et déteste sur Windows PowerShell est sa souplesse inhérente. À bien des égards, il est écrit comme un langage de programmation. Si vous n'êtes pas un programmeur, vous pouvez très bien ignorer qu'et le traiter comme un shell de ligne de commande.

Eh bien, peut-être pas complètement « ignorer. » Vous voyez, il semble toujours être trois ou quatre façons différentes de faire presque n'importe quoi dans Windows PowerShell. Vous devez seulement vraiment savoir l'une manière la plus logique pour vous. Toutefois, un utilisateur de Windows PowerShell intelligent, sera familier avec tous les moyens avec lesquels accomplir une tâche donnée. De cette façon, lorsque vous examinez des exemples écrits par d'autres personnes, vous serez capable de faire sens de ce que vous avez vu.

Tout à propos de l'Alias

Les alias sont le premier « raccourci » rencontrera la plupart d'entre vous. Tenir compte de cette commande :

PS C:\> Get-WmiObject -class Win32_LogicalDisk -Filter "DriveType=3" | >> Where-Object -FilterScript{ $_.FreeSpace / $_.Size -lt .1 } | >> Select-Object -Property DeviceID,FreeSpace,Size >>

Vous pouvez le raccourci il aime donc :

PS C:\>gwmi Win32_LogicalDisk -Fi "DriveType=3" | >> ?{ $_.FreeSpace / $_.Size -lt .1 } | >> SelectDeviceID,FreeSpace,Size >>

J'ai utilisé à la place des noms de commandes d'alias, et j'ai tronqué paramètres à moins de caractères. Windows PowerShell vous permet de tronquer les noms de paramètres tant que vous fournir assez de chaque nom de paramètre pour qu'il soit identifié de manière unique. Il est pour le moins saisissant, mais une commande beaucoup plus difficile à lire. Je les avocats mes étudiants à épeler tout lorsqu'ils sont un exemple d'édition, enregistrant dans un script ou autrement rendant un artefact permanent. Cela rendra plus facile à identifier par la suite.

Dans le Windows PowerShell ISE et la plupart des autres éditeurs, vous pouvez la partie tronquée du nom du paramètre de type et touché Tab pour terminer de taper le nom complet. Il y a moins de taper — et il est plus facile à lire. J'ai complètement omis les autres noms de paramètre, parce qu'ils sont des paramètres positionnels. En d'autres termes, tant que je me souviens obtenir toutes les valeurs alignés dans le bon ordre, la commande fonctionne toujours.

Encore une fois, des noms tronqués ne sont pas aussi faciles à lire. La plupart des gens apprécieront vous en utilisant le nom de paramètre complet dans un script. En utilisant les noms de paramètre complet est finalement moins de travail sur vous même, parce que vous n'avez pas se rappeler quel ordre ils arrivent. Lorsque vous utilisez des noms, vous pouvez les mettre dans un ordre quelconque, que vous souhaitez.

Expressions entre guillemets

Parfois, vous devrez insérer un résultat de l'expression dans une chaîne entre guillemets. Cela vous permet d'inclure ce résultat en sortie de votre script. Une façon de faire est de stocker le résultat dans une variable. Ensuite, utilisez le truc de Windows PowerShell, de l'insertion de variables en chaînes double-cité. Windows PowerShell va remplacer la variable avec son contenu :

$disk = Get-WmiObject -class Win32_LogicalDisk -filter "DeviceID='C:'" $freepercent = $disk.freespace / $disk.size * 100 Write-Host "Free space on drive C: at $freepercent percent"

Windows PowerShell vous permet également de mettre l'expression complète entre guillemets doubles. La syntaxe est dérivée d'une astuce de shell Unix. Il semble un peu bizarre, mais vous verrez des gens beaucoup l'utiliser :

$disk = Get-WmiObject -class Win32_LogicalDisk -filter "DeviceID='C:'" Write-Host "Free space on drive C: at $($disk.freespace / $disk.size * 100) percent"

Je préfère la première forme, principalement parce que j'ai tendance à travailler surtout avec Windows PowerShell débutants. La première forme est un peu plus facile à lire. Une chose se passe à chaque étape du script, rendant la logique un peu plus facile à suivre.

Windows PowerShell utilise suffisamment de ponctuation que la seconde forme semble plus confuse. Cependant, la seconde forme est aussi techniquement un peu plus efficace. Il n'est pas de créer une variable Windows PowerShell pour effectuer le suivi. Il comporte également un peu wee moins saisissant, dont la plupart d'entre vous semble similaires.

Création d'objets

La forme longue encore une fois est très pratique lorsque j'ai besoin de créer un objet personnalisé :

$cs = Get-WmiObject -class Win32_ComputerSystem $os = Get-WmiObject -class Win32_OperatingSystem $obj = New-Object -TypeNamePSObject $obj | Add-Member -MemberTypeNoteProperty -Name OSVersion -Value $os.version $obj | Add-Member -MemberTypeNoteProperty -Name Mfgr -Value $cs.manufacturer $obj | Add-Member -MemberTypeNoteProperty -Name Model -Value $cs.model Write-Output $obj

Parfois, j'en vais raccourci cela un peu à l'aide de cette technique, qui combine les commandes Add-membre en un seul pipeline :

$cs = Get-WmiObject -class Win32_ComputerSystem $os = Get-WmiObject -class Win32_OperatingSystem $obj = New-Object -TypeNamePSObject $obj | Add-Member -MemberTypeNoteProperty -Name OSVersion -Value $os.version –PassThru | Add-Member -MemberTypeNoteProperty -Name Mfgr -Value $cs.manufacturer –PassThru | Add-Member -MemberTypeNoteProperty -Name Model -Value $cs.model –PassThru

Récemment, j'ai commencé à passer à une technique quelque peu différente, qui est encore plus lisible :

$cs = Get-WmiObject -class Win32_ComputerSystem $os = Get-WmiObject -class Win32_OperatingSystem $props = @{'OSVersion'= $os.version; 'Mfgr'=$cs.manufacturer; 'Model'=$cs.model} $obj = New-Object -TypeNamePSObject -Property $props Write-Output $obj

Ma préférence pour ce type de syntaxe de long-forme est encore une fois, en raison de sa lisibilité. Je travaille principalement avec les nouveaux arrivants de Windows PowerShell, la lisibilité est donc essentielle de les aider à comprendre ce qui se passe. Vous verrez également les gens utilisent ce truc :

$obj = Select-Object OSVersion,Mfgr,Model $obj.OSVersion = $os.version $obj.Mfgr = $cs.manufacturer $obj.Model = $cs.model $obj

Les résultats sont fondamentalement les mêmes, et qu'un dernier utilise un peu moins saisissant. C'est le genre d'une astuce hacker utiliser Select-Object de cette façon. Il profite du fait que vous pouvez dire Select-Object pour sélectionner une propriété qui n'existe pas. Il va en fait créer la propriété, avec une valeur vide sur l'objet de sortie.

Il en fait la peine me voir Select-Object utilisé (ou, plus exactement, utilisé à mauvais escient) de cette façon et je ne suis pas le seul. Dès 2008, certains de mes collègues MVP PowerShell de Windows ont été dénoncer cet usage. Indépendamment de la façon dont vous vous sentez sur cette technique, vous devez apprendre à reconnaître ce que vous savez ce qu'il fait.

Dans Windows PowerShell version 3, vous serez réellement capable de faire cela :

[pscustomobject]@{'OSVersion'= $os.version; 'Mfgr'=$cs.manufacturer; 'Model'=$cs.model}

Je n'ai pas décidé je pense de cette syntaxe, mais il est généralement OK. Il est encore très lisible et élimine un peu de dactylographie. Personnes commencera à l'aide aussi, donc vous devez le reconnaître pour ce qu'elle est. La dernière technique semble également exécuter plus rapidement (en savoir plus sur le blog du Jonathan Medd).

Raccourcis de l'objet

La dernière technique de raccourci que vous verrez souvent est similaire pour les expressions dans des chaînes. C'est totalement légal, syntaxe de programmation — il peut juste être source de confusion pour les nouveaux arrivants. Pourtant, il ne rien de « mal » avec elle, vous devez s'habituer à voir et savoir ce qu'il fait.

Disons que vous voulez exécuter une méthode d'un objet et ensuite faire quelque chose avec l'une des propriétés de l'objet qui en résulte, comme suit :

$string = ' Hello ' $string = $string.Trim() $string.Length

Vous pouvez tout ce raccourci à l'aide de parenthèses. L'expression entre parenthèses est évaluée en premier, et Windows PowerShell remplace essentiellement l'entre parenthèses par son résultat :

$string = ' Hello ' ($string.Trim()).length

Il empile jusqu'à la ponctuation beaucoup, donc il est un peu plus difficile pour votre cerveau à déchirer les pièces et de déterminer ce qui se passait, mais il est complètement légal. Il pourrait même exécuter un tiny peu plus vite, parce que Windows PowerShell n'a pas à manipuler la variable autant de fois.

Désolé de tout ce qui

À certains égards, c' est malheureux Windows PowerShell ne pouvait pas offrir simplement une façon de faire n'importe quoi. Puis nous tous seulement devions apprendre que l'une des façons. Comme c'est le cas, nous avons une coquille qui offre beaucoup de variations de syntaxe différente pour ce qui est essentiellement la même tâche. Elle paie doit au moins se familiariser avec les nombreuses alternatives de syntaxe. De cette façon, vous pouvez faire usage de quelque exemples vous rencontrer.

Raymond Chen

Don Jones est un Microsoft MVP lauréat et auteur de « Apprendre Windows PowerShell dans un mois de repas » (Manning Publications, 2011), un livre conçu pour aider à tout administrateur de devenir efficace avec Windows PowerShell. Jones offre également le publique et sur les lieux de formation Windows PowerShell. Communiquer avec lui par le biais de ConcentratedTech.com ou bit.ly/AskDon.

Contenu associé