Windows PowerShell Filtre à gauche, Mise en forme à droite

Don Jones

Contenu

Filtre de gauche, à la source
Format de droite, et vous avez terminé avec IT
les rouages du système

Dans la liste de publipostage Windows PowerShell Most Valuable Professional (MVP), nous récemment été examinée et la tentative de document, Windows PowerShell “ pièges respectez. Vous savez ce que nous entendons : ces petites choses don’t fonctionne exactement comme vous considérer s'il s'agissait, et qui peut vraiment entraîner des problèmes lorsque vous apprentissage de l'interpréteur de commandes.

Deux problèmes plus importants impliquent le filtrage et mise en forme. J'ai mentionné dans la liste que vous avez essayé d'aider les gens éviter ces problèmes dans ces zones, sans oublier pour "filtrer gauche, mettre en forme vers la droite." Il est survenu pour moi que l'expression peut être une bonne base pour une colonne utilisation plus efficace de Windows PowerShell, donc nous Voici.

Filtre de gauche, à la source

Utilisation libre Active Directory (AD) gestion cmdlets de Quest (vous trouverez les à quest.com/powershell) un lot et encouragez les autres, utiliser également. Une applet de commande, Get-QADUser, est conçu pour récupérer les utilisateurs d'Active Directory. Voir personnes exécuter une commande telle que celle-ci n'est pas rare que :

Get-QADUser | Where-Object { $_.Department -eq "Sales" } | Set-QADUser -department "Inside Sales"

Ce serait modifier tous les utilisateurs dont l'attribut Active Directory service est défini sur vente, afin que l'attribut a été défini à l'intérieur des ventes. Le problème est où le filtrage est en cours. La première cmdlet, Get-QADUser va pour récupérer chaque utilisateur unique à partir de l'intégralité du domaine.

Fort heureusement, il n'est pas extraire chaque attribut de chaque utilisateur par défaut, mais dans un domaine important, il fera plus que suffisante dommages comme contrôleur de domaine médiocre struggles (DC) pour transmettre des informations de compte d'utilisateur à votre ordinateur client. Votre client doit examiner chaque compte, un à la fois, puis ignorer ceux qui n'ont un attribut de service contenant la valeur de vente. Une perte !

C'est pourquoi j'aime le "filtrer gauche." Toujours déplacer critères de filtrage autant à gauche de ligne de commande a comme possible.In ce cas, la cmdlet Get-QADUser lui-même se trouve de prise en charge le filtrage :

Get-QADUser -Department "Sales" | Set-QADUser -department "Inside Sales"

Il y a plus nécessaire pour la cmdlet Where-Object. Mieux encore, en utilisant cette syntaxe, Get-QADUser est transmettant les critères de filtre pour le contrôleur de domaine et le contrôleur de domaine lors de la récupération et transmettre uniquement les comptes correspondant à ce critère. Contrôleurs de domaine sont fantastique au filtrage, leur faire toute la journée, vraiment, donc nous placez le filtrage dans le meilleur endroit possible pour une exécution rapide. Votre client ne doit traiter autant d'objets provenant du contrôleur de domaine pour votre commande s'exécute plus rapidement et plus efficacement.

Voici un autre exemple, à l'aide de Windows Management Instrumentation (WMI) :

Get-WmiObject CIM_DataFile -computerName Server2 | Where { $_.FileName -like "*.dll" }

Ce sera contacter WMI sur Serveur2, d'obtenir toutes les instances de la classe CIM_DataFile, qui représente les fichiers sur le disque dur et éliminer ceux qui ne sont pas des fichiers DLL par filtrage. Vous êtes donc gauche avec une liste de fichiers DLL sur ce serveur. Mais ce temps d'exécution, vous importez toutes informations de fichier du serveur votre ordinateur. Là encore, déplacement filtrage gauche supplémentaire serait utile et, dans ce cas, il est possible pour ce faire :

Get-WmiObject CIM_DataFile -computerName Server2 -filter "FileName LIKE '*.dll'"

Vous devez utiliser la syntaxe filtre légèrement différente en effet, cette syntaxe n'est pas exécutée par Windows PowerShell. Au lieu de cela, il est transmis à WMI sur l'ordinateur distant. Il prendra toujours temps à s'exécuter, mais il impliquera moins le trafic réseau et, finalement, moins de surcharge sur Server2 et sur votre ordinateur. Prenez l'habitude de lire des applets de commandefichiers (Help Get-WmiObject, dans ce cas) d'aide pour afficher les options de filtrage offre une applet de commande. Seulement s'appuient sur Where-Object lorsque Get-* cmdlet vous utilisez ne prend en charge le filtrage que vous avez besoin.

Format de droite, et vous avez terminé avec IT

Autre gotcha se rapporte à format-* cmdlets, telles que format-table et Format-List. Vous verrez nouveaux exécuter quelque chose comme ceci :

Get-Process | Format-Table ID,VM,Name | Export-CSV c:\processes.csv

Il ne fonctionne pas. Oh, il fonctionnera, mais vous ne satisfait du résultat. Et si vous prenez une seconde à vraiment lire cette commande, vous vous demanderez peut-être exactement ce que vous souhaitiez obtenir quand même. Vous avez obtenu un ensemble de processus, les mis en forme sous la forme d'une table, et ensuite une certaine manière souhaité la table de devenir un fichier .csv ? Si l'objectif de fin est d'obtenir un fichier .csv contenant uniquement certaines propriétés des objets, vous exécuterez ce :

Get-Process | Select-Object ID,VM,Name | Export-CSV c:\processes.csv

Si l'objectif est d'obtenir un tableau de mise en forme et en colonnes dans un fichier texte, vous devez le faire :

Get-Process | Format-Table ID,VM,Name | Out-File c:\processes.txt

Mais vous ne pouvez pas mélanger et correspondent à ces deux approches. Comprendre pourquoi c'est ainsi nécessite certaines informations sur comment ces applets de commande format fonctionnent, ainsi que comment out-* applets de commande de travail.

Le pipeline Windows PowerShell — qui est ce que vos commandes s'exécutent dans - est codé en dur à la fin de la Out-Default applet de commande. Cette applet de commande redirige peu plusieurs objets à Out-Host, qui est responsable de l'affichage de sortie à l'écran.

Toute ligne de commande, ou pipeline, pour utiliser le terme correct, qui ne se terminent par une sortie-* applet de commande, par défaut, terminera dans Out-Default, qui est identique à dire qu'il se termine par Out-Host. L'astuce est que out-* applets de commande ne pas savoir quoi faire avec les objets, ils ont besoin les objets transformées en instructions de mise en forme. Par conséquent, lorsque Out-Host obtient objets de processus, il envoie ces objets à un des format-* applets de commande. Celui qu'il utilise, table, Wide, personnalisée ou la liste, est basé sur un ensemble de règles ne pas pouvoir couvrir dans cette colonne. Mais il envoie des objets pour un d'entre eux et le format * cmdlet accepte les objets et génère des instructions de mise en forme. La sortie-* applets de commande sait comment utiliser les instructions de mise en forme et les utiliser pour créer n'importe quelle affichage est nécessaire.

Par conséquent, nous allons placer qui en termes pratiques : Il existe trois ou quatre principal hors-* applets de commande que vous allez rencontrer et utiliser régulièrement : Out-Host, Out-File, Out-Printer et Out-String.

Ces sont conçus pour utiliser les instructions de mise en forme uniquement, puis prenez les instructions pour construire un écran, un fichier texte, une page d'imprimante ou une chaîne, respectivement. La seule pour obtenir les instructions de formatage consiste à exécuter des objets dans un format-* applet de commande, et instructions de mise en forme sont la seule chose format-* produisent des applets de commande. Ainsi, lorsque vous exécutez ceci :

Get-Process | Format-Table ID,VM,Name |Export-CSV c:\processes.csv

quel va dans le fichier .csv est les instructions mise en forme produites par format-table, sans doute pas du tout ce que vous attendiez. Après l'exécution d'un format-* applet de commande, les objets d'origine sont perdues et vous êtes gauche avec les instructions de mise en forme. Voici une autre règle simple pour vous : Mettre en forme vers la droite. En d'autres termes, pousser l'applet de commande mise en forme vers l'extrême droite de la ligne de commande. La seule peut être postérieure à un format-* cmdlet est un retour chariot ou une sortie-* applet de commande. C'est pourquoi il est autorisé :

Get-Process | Format-Table ID,VM,Name | Out-File c:\processes.txt

Out-File sait comment lire les instructions de mise en forme et les utiliser pour créer un fichier texte. Cela est également autorisée :

Get-Process | Format-Table ID,VM,Name 

Ici, vous êtes fier le Out-Default codée de manière irréversible, qui redirige vers Out-Host, qui sait comment utiliser les instructions de mise en forme et créer un affichage de texte dans la fenêtre console, ou ordinateur hôte. Conserver votre mise en forme comme présent vers la droite que possible, suivi par rien ou par une sortie * applet de commande et vous serez bien.

Un conseil plus : Rien ne doit suivre une sortie-* cmdlet car, avec une seule exception, aucune d'entre elles émettent objets pour le pipeline. Il n'y a aucun sens dans avoir rien suivez une sortie-* applet de commande, car rien proviendront de celui-ci.

les rouages du système

J'espère que vous avez vous ont aidé comprendre pourquoi ces pièges sont la manière dont elles sont. Mais, au minimum, «filtrer gauche, format droite»et vous devez être en mesure de rester hors de problèmes en évitant ces pièges entièrement.

La plupart des caprices peu de Windows PowerShell deviennent plus faciles à comprendre une fois que vous comprenez vraiment comment et pourquoi l'interpréteur de commandes fonctionne de la manière contraire. Pris le temps pour savoir ce qui se passe en coulisses et en appliquant ces informations chaque fois que vous obtenez des résultats inattendus dans le shell, va rapidement devenir un expert de Windows PowerShell.

Don Jones est un des formateurs de Windows PowerShell plus expérimentés et des writers du pays. Il blogs semaine Windows PowerShell conseils à ConcentratedTech.com ;Vous pouvez également contacter ou lui poser des questions il.