11Sep

Geek School: Travailler avec des collections dans PowerShell

Depuis PowerShell est basé sur le. Net Framework et intègre diverses autres technologies comme WMI et CIM, il y a toujours plus d'une façon d'accomplir la même chose. Venez nous rejoindre pour ce court article où nous apprenons comment choisir la meilleure méthode pour accomplir nos tâches.

Soyez sûr de lire les articles précédents de la série:

  • Apprendre à automatiser Windows avec PowerShell
  • Apprendre à utiliser des applets de commande dans PowerShell
  • Apprendre à utiliser des objets dans PowerShell
  • Apprentissage de formatage, filtrage et comparaison dans PowerShell
  • Apprenez à utiliser Remoting dansPowerShell
  • Utilisation de PowerShell pour obtenir des informations sur l'ordinateur

Et restez à l'écoute pour le reste de la série toute la semaine.

Utilisation des applets de commande par lots

Plus tôt dans la série, lorsque nous vous avons présenté le pipeline, nous vous avons montré comment extraire les objets qu'une cmdlet envoie à une autre cmdlet en utilisant quelque chose comme:

Get-Process -Nom du bloc-notes |Stop-Process

Cela tuerait n'importe quel processus avec le nom "notepad".Mais vous vous demandez probablement comment PowerShell est capable de tuer chaque instance de bloc-notes avec une seule commande. La réponse se trouve dans l'aide de la cmdlet Stop-Process.

help Stop-Process -Full

Si vous regardez la dernière ligne de code dans la section de syntaxe, vous pouvez voir que le paramètre InputObject accepte un objet de type Process [], et chaque fois que vous voyez un type suivi de deux crochets commecela signifie que le paramètre accepte un ou plusieurs du type précédent. Dans ce cas, il accepte un ou plusieurs objets de processus. Techniquement, nous dirions que la cmdlet InputObject accepte un de processus. Chaque fois que vous disposez d'une cmdlet prenant en charge les opérations de traitement par lots de cette manière, utilisez-la. C'est le choix numéro un.

Utilisation de WMI

Bien que WMI ne soit pas la meilleure technologie à expédier depuis le QG de Microsoft, elle arrive en deuxième position sur la liste des méthodes de travail avec les collections d'objets. Nous pourrions facilement obtenir une liste des processus en cours d'exécution de la classe Win32_Process comme suit:

Get-WmiObject -Class Win32_Process

Depuis la requête WMI renvoie son propre type d'objet, vous devrez rechercher une méthode qui peut arrêter le processus, doncpermet à pipe de Get-Member.

Get-WmiObject -Classe Win32_Process |Get-Member

On dirait que la chose la plus proche d'arrêter est la méthode terminate, donc ça doit être la seule. Pour appeler une méthode sur un objet WMI, il vous suffit de l'acheminer vers Invoke-WmiMethod et de spécifier le nom de la méthode.

Get-WmiObject -Classe Win32_Process -Filter "nom = 'notepad.exe'" |Invoke-WmiMethod -Name Terminer

Génial, cela a fait l'affaire. Chaque fois que vous obtenez un ReturnValue de 0 dans WMI, rappelez-vous que la commande a été exécutée avec succès.

Enumération

A défaut des deux autres méthodes, si vous devez faire quelque chose à un groupe d'objets, vous pouvez énumérer l'objet entier et agir sur chaque objet individuel. Vous devez d'abord trouver la méthode que vous utiliseriez pour arrêter un seul processus.

Get-Process |Get-Member -MemberType, méthode

Parfait, il semble que l'on puisse utiliser la méthode Kill, puis canaliser dans ForEach-Object pour les tuer tous.

Get-Process -Name Bloc-notes |ForEach-Object -Process{ $ _. Kill()}

Ici, nous avons récupéré tous les objets de processus renvoyés par Get-Process à la cmdlet ForEach-Object. Tout comme la cmdlet Where-Object, nous avons représenté chaque objet dans le pipeline avec $ _ que nous avons pu appeler sur la méthode Kill() .Avec tout cela dit et fait, énumérer une collection est beaucoup plus lent que les méthodes ci-dessus et ne devrait être utilisé comme un dernier résultat.

Résumé

Choix One

Get-Process -Name Bloc-notes |Stop-Process

Choix Deux

Get-WmiObject -Classe Win32_Process -Filter "nom = 'notepad.exe'" |Invoke-WmiMethod -Name Terminer

Choix trois

Get-Process -Name Bloc-notes |ForEach-Object -Process{ $ _. Kill()}

C'est tout pour les gens de l'époque, à la semaine prochaine pour plus de plaisir avec PowerShell.