Windows PowerShell Filter links, Format rechts

Don Jones

Inhalt

Links zu filtern, an der Datenquelle
Rechts formatieren – und Sie mit 's
Unter der Lupe

Der Windows PowerShell MVP Most Valuable Professional ()-Mailingliste wir vor kurzem wurde erörtert, und beim Dokument – Windows PowerShell “ Punkte eingeben. Sie wissen, was wir meinen: wenige Dinge, die genau die Ihrer Meinung nach würde diese Weise funktionieren don’t – und, kann wirklich Probleme verursachen, wenn Sie die Shell erlernen.

Zwei der größten Probleme umfassen, Filtern und formatieren. Erwähnt in der Liste haben, versucht haben, helfen, Leute, die Probleme in diesen Bereichen zu vermeiden, durch erinnern "Filtern nach links, rechts formatieren". Er aufgetreten ist für mich, dass der Ausdruck eine gute Basis für eine Spalte bei effektiver Verwendung von Windows PowerShell möglicherweise – also Hier werden.

Links zu filtern, an der Datenquelle

Verwendung des Quest freien Active Directory (AD) Management Cmdlets (diese finden Sie auf quest.com/powershell) viel und ich empfehlen Sie andere Personen Sie zu verwenden. Ein Cmdlet, Get-QADUser, sollen Benutzer aus dem Active Directory abrufen. Anzeigen von Personen, die Ausführung eines Befehls wie diesem ist nicht, ungewöhnlich:

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

Dies würde jeder Benutzer, deren Attribut AD-Abteilung auf Verkauf, festgelegt ist, ändern, sodass stattdessen das Attribut auf in Sales festgelegt wurde. Das Problem ist die Filterung ausgeführt wird. Das erste Cmdlet „ Get-QADUser soll jedem einzelnen Benutzer aus der gesamten Domäne abzurufen.

Glücklicherweise es wird nicht jedes Attribut standardmäßig von jedem Benutzer abrufen, jedoch in einer großen Domäne wird dafür mehr als genug Schaden als schlechte Domänencontroller (DC) Probleme zur Übertragung der Benutzerkonto Informationen auf Ihren Clientcomputer. Der Client muss dann untersuchen Sie jedes Konto einzeln nacheinander, und solche, die ein mit dem Wert Sales Department-Attribut verfügen nicht verwerfen. Welche eine Verschwendung!

Deswegen ich gerne "links filter". Immer verschieben Filterkriterien so weit links neben der Befehlszeile er als possible.In in diesem Fall, das Get-QADUser-Cmdlet selbst geschieht mit Filterung unterstützt:

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

Es ist nicht mehr erforderlich für die WHERE-Object-Cmdlet. Verbesserte noch mithilfe dieser Syntax abrufen QADUser übertragen die Filterkriterien des DOMÄNENCONTROLLERS, und der Domänencontroller ist abrufen und übertragen nur die Konten, entsprechen diesen Kriterien entsprechen. Domänencontroller sind tolle zur Filterung – wie es ganzen Tag lang wirklich – damit wir die Filterung in der möglichen besten für die schnelle Ausführung eingefügt sind. Der Client keine Umgang mit beliebig viele Objekte der Domänencontroller stammen, damit der Befehl schneller und effizienter ausgeführt wird.

Hier ist ein weiteres Beispiel mithilfe von WMI (Windows Management INSTRUMENTATION):

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

Dieser Kontakt WMI auf Server2, erhalten Sie alle Instanzen der Klasse CIM_Datafile wird – die Dateien auf der Festplatte darstellt – und die DLL-Dateien sind nicht herausfiltern. So sind Sie mit einer Liste von DLL-Dateien auf dem Server belassen. Aber diese Ausführung dauern soll – Sie sind alle Dateiinformationen des Servers über auf dem Computer einbinden. Erneut verschieben, Filtern nach weiteren Links helfen würde und in diesem Fall ist es möglich, dazu:

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

Sie müssen etwas anderen Filtersyntax verwenden, da diese Syntax ist nicht von Windows PowerShell ausgeführt wird. Stattdessen ist es zu WMI auf dem Remotecomputer übertragen. Es dauert noch Zeit zum Ausführen, jedoch umfasst weniger Netzwerkverkehr und schließlich weniger Overhead auf Server2 und Ihrem Computer. Werfen Sie, des Cmdlets lesenHilfe-Dateien (Help Get-WmiObject, in diesem Fall) welche Filteroptionen finden Sie ein Cmdlet bietet. Nur abhängig von WHERE-Object bei Get-* Cmdlets, die Sie verwenden, unterstützt nicht die Filterung, die Sie benötigen.

Rechts formatieren – und Sie mit 's

Der andere Punkt bezieht sich auf der Format-* Cmdlets wie z. B. Format-Table und Format-List. Ich sehen Neulinge etwa wie folgt ausgeführt:

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

Es funktioniert nicht. ACH Ja, wird ausgeführt, aber Sie wird nicht gerne die Ergebnisse. Und wenn Sie eine zweite, den Befehl wirklich zu lesen, können Sie Fragen, genau Ihren Erwartungen trotzdem passieren. Sie erhalten eine Reihe von Prozessen, diese als eine Tabelle formatiert haben, und Sie dann die Tabelle eine CSV-Datei werden irgendwie möchten? Wenn das Endziel eine CSV-Datei zu erhalten, die nur bestimmte Objekteigenschaften enthält, würden Sie dies ausführen:

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

Wenn das Ziel ist eine formatierte, einspaltige Tabelle in eine Textdatei zu erhalten, würden Sie diese Schritte ausführen:

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

Aber Sie können nicht mischen und diese beiden Ansätze entsprechen. Grundlegendes zu Warum, so erfordert einige Hintergrundinformationen über die Funktionsweise dieser Format Cmdlets, zusammen mit Out-* Cmdlets funktionieren.

Windows PowerShell-Pipeline – das ist, was Ihre Befehle ausführen, - ist hartcodiert zum Beenden in der Out-Default Cmdlet. Dieses Cmdlet etwas mehr als Objekte umleiten Out-Host, die zum Anzeigen der Ausgabe auf dem Bildschirm verantwortlich ist.

Jeder Befehlszeile – oder Rohrleitung mit den richtigen Begriff – in eine Out-endet nicht * Cmdlet wird, wird standardmäßig beendet in Out-Default, die besagt, dass er identisch ist endet Out-Host. Der Trick ist, Out-* Cmdlets nicht wissen, was mit Objekten zu tun – Sie benötigen diese Objekte in Formatierungsanweisungen umgewandelt. Also wenn ruft Out-Host Process-Objekte, sendet er diese Objekte zu einem der Format-*-Cmdlets. Er verwendet eine – Table, Wide, benutzerdefinierte oder Liste – basiert auf einer Reihe von Regeln, die ich in dieser Kolumne behandelt werden können. Doch die Objekte ein, und die Format-gesendet * Cmdlet nimmt die Objekte und Formatierungsanweisungen erzeugt. Out-* Cmdlets wissen, wie die Formatierungsanweisungen nutzen und Sie verwenden Sie zum Erstellen, jeweils Anzeige erforderlich ist.

Wir legen, die in praktisch: Es gibt drei oder vier wichtigsten Out-* Cmdlets, die Sie stoßen und regelmäßig verwenden: Out-Host, out, Out-Printer und Out-String.

Diese dienen nur Formatierungsanweisungen beanspruchen und nehmen Sie die Anweisungen zum Erstellen von einer Bildschirmanzeige, eine Textdatei, einer Druckseite oder eine Zeichenfolge. Die einzige Möglichkeit die Formatierungsanweisungen erhalten ist zur Ausführung von Objekten durch eine Format-*-Cmdlet – und Formatierungsanweisungen sind lediglich die Format-* Cmdlets zu erzeugen. Ja, wenn Sie dies ausführen:

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

Was geht in der CSV-Datei die Formatierungen Anweisungen vom Format-Table sind – vermutlich gar nicht erwartet. Nach der Ausführung eine Format-*-Cmdlet, die ursprünglichen Objekte verloren, und Sie sind nach links mit Formatierungsanweisungen. Hier ist eine einfache Regel für Sie: Formatieren Sie nach rechts. Verschieben Sie mit anderen Worten, das Formatierung Cmdlet extreme rechts von der Befehlszeile. Der einzige Unterschied, die nach einem Format-stammen kann * Cmdlet ist ein Wagenrücklauf oder ein Out-*-Cmdlet. Warum ist dies ist zulässig:

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

Out-File weiß, wie lesen Sie diese Formatierungen Anweisungen und verwenden diese um eine Textdatei zu erstellen. Dies ist auch zulässig:

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

Hier sind Sie auf Out-Default hart codiert, die an umleitet verlassen Out-Host, der weiß, wie Formatierungsanweisungen beanspruchen und erstellen Sie eine Textanzeige in das Fenster Host oder -Konsole. Formatierung, wie weit nach rechts wie möglich, entweder durch nichts oder ein Out-folgen * Cmdlet, und Sie werden einwandfrei.

Eine weitere Tip: Nichts soll die Folgen einer Out-*-Cmdlet da mit nur einer Ausnahme keines davon-Objekten, die Pipeline auszugeben. Es macht keinen Sinn man etwas folgen ein Out-*-Cmdlet, da nichts davon kommt.

Unter der Lupe

Ich hoffe, dass ich Sie verstehen geholfen haben, warum diese Punkte die Art und Weise sind, sind. Aber zumindest, denken Sie daran "filter links, Format rechts"und Sie sollte außerhalb des Probleme bleiben, indem diese Punkte vollständig vermeiden können.

Viele Windows PowerShell etwas Marotten sind leichter zu erfassen, wenn Sie wirklich verstehen, wie und warum die Shell die Art und Weise funktioniert dies der Fall ist. Die Zeit erfahren Sie, was hinter den Kulissen passiert, und dieses Wissen anwenden, wenn Sie in der Shell unerwartete Ergebnisse erhalten – wird schnell ein Windows PowerShell-Experte vornehmen.

Don Jones ist eine von der Nation erfahrene Windows PowerShell Schulungsleiter und Schreiber. Er Blogs Tipps wöchentlichen Windows PowerShell ConcentratedTech.com;Sie können auch kontaktieren Sie ihn oder Fragen ihn vorhanden.