Kapitel 21. Teil 1 - Objekte erstellen und Daten mit Objekten ausgeben. PowerShell im Detail - Don Jones, Richard Siddaway

    Dieses Kapitel vermittelt einen Überblick über den „Geist“ von PowerShell, seine Ideologie im Bereich Pipelining, und ist für das Verständnis des ultimativen Programmierstils von entscheidender Bedeutung.

    Kapitel 21. Erstellen von Objekten für die Ausgabe

    in diesem Kapitel enthält:
    "Objektivierung" Ihrer Ausgabe
    Erstellen eines benutzerdefinierten Objekts (enthält Informationen zum korrekten Erstellen von Objekten in PoSh)
    Arbeiten mit Eigenschaftssammlungen


    In den vorherigen Kapiteln haben wir Ihnen gezeigt, wie Sie ein einfaches Skript erstellen und es in eine Funktion umwandeln. Wir betonen, dass Skripte und Funktionen nur einen einzigen Datentyp ausgeben sollten. In unserem vorherigen einfachen Beispiel haben wir nur einen Befehl verwendet, der nur einen einzigen Datentyp ausgibt. Aber Sie werden sich sicherlich in einer Situation befinden, in der Sie mehrere Befehle ausführen, deren Ausgabe kombinieren und diese Kombination der Ausgabe einer Funktion oder eines Skripts geben müssen. In diesem Kapitel erfahren Sie, dass das Hauptziel beim Erstellen von Objekten (im Text von benutzerdefinierten Objekten) darin besteht, Daten aus mehreren Objekten zu einem Objekt und die anschließende Ausgabe eines Skripts oder einer Funktion zu kombinieren. Richard erinnert sich, wie bei einer Konferenz die Frage gestellt wurde, ob PowerShell einen Befehl hat, der wie Union from SQL funktioniert. In diesem Kapitel werden Sie mit PowerShell vertraut, da Sie mit Objekten arbeiten.

    21.1 Warum befinden sich Objekte am Ausgang?
    PowerShell erstellt nur Objekte. Objekte sind das Einzige, was am Ausgang des Skripts passieren kann (oder die Funktion kann ab diesem Zeitpunkt alles, was für das Skript gilt, auf die Funktion angewendet werden). Möglicherweise müssen Sie nur einen einfachen Booleschen Wert drucken, dies ist jedoch auch ein Objekt. Datum ist ein Objekt. Eine Zeichenfolge oder ein Zeichen ist ein Objekt. Komplexere Daten wie Prozessor- oder Servicedetails werden alle als Objekte dargestellt.

    Exkurs: Wir sehen immer noch, wie viele Personen Daten in Zeichenfolgen anstelle von vollwertigen Objekten aus ihren Skripten ausgeben (Notizübersetzer - das heißt, sie verknüpfen Daten zu einer durch Kommas getrennten Zeichenfolge usw.). Mach das nicht. Sie sollten immer ein Objekt ausgeben. Wenn Sie immer noch nicht wissen, wie Sie im Forum eine Frage stellen sollen, fragen Sie nach, wie Objekte zurückgezogen werden.

    Einfügen von einem Übersetzer - Der Stil des Posh unterscheidet sich von der klassischen Programmiersprache: Posh ist die Sprache für Administration, Automatisierung und "Large Block Management". Sie müssen nach maximaler Einfachheit und Klarheit streben. Zuvor haben Sie die Textausgabe eines Befehls analysiert, und das war korrekt. In Posh erstellen Sie ein Objekt und bearbeiten es. Der Unterschied ist riesig.

    Beispiel - Sie müssen sich NetBIOS ansehen und einige Daten analysieren. Unten senden stil:
    # делаем функцию
    Function Get-NBTName
    {
        # получаем консольный вывод команды NBTSTAT, сразу же выкидываем ненужное
        $data=nbtstat /n | Select-String "<" | where {$_ -notmatch "__MSBROWSE__"}
        # обрезаем каждую строку от мусора
        $lines=$data | foreach { $_.Line.Trim() }
        # расщепляем кажду строку на массив элементов по пробелу
        # то что получилось помещаем в хэш таблицу формируя объект
        $lines | foreach { $temp=$_ -split "\s+"
            [PSCustomObject]@{
            Name=$temp[0]
            NbtCode=$temp[1]
            Type=$temp[2]
            Status=$temp[3]
            }
        }
    }
    


    Jetzt machen wir einen Funktionsaufruf, sortieren ihn und formatieren ihn dann automatisch, zum Beispiel so:
    PS C:\> Get-NBTName | sort type | Format-Table –Autosize
    


    Am Ausgang erhalten wir:
    Name NbtCode Type Status
    ---- ------- ---- ------
    MYCOMPANY <1E> GROUP Registered
    MYCOMPANY <00> GROUP Registered
    MYCOMPANY <1D> UNIQUE Registered
    CLIENT2 <00> UNIQUE Registered
    CLIENT2 <20> UNIQUE Registered
    

    Insgesamt können bei der Ausgabe der Funktion Get-NBTName Objekte übertragen, sortiert, abgetastet usw. werden. Nein für %%.

    Man kann sich streiten - na ja, am Anfang wurde geparst. Die Antwort ist, dass Sie 1 Mal in einem Posik analysieren - an der Eingabe vom Ausgabezeilenwerkzeug und an der Befehlszeile, die Sie immer analysieren, an der Ausgabe jeder Funktionseingabe. Sie müssen jedes Mal ein Parsing durchführen, wenn Sie die Ausgabe von nbtstat erhalten, sie dann an ping übergeben und dann versuchen, beispielsweise tracert auszuführen, und jedes Mal, wenn Sie die Zeilen durchlaufen müssen.


    Objekte sind nur Datenstrukturen, die PowerShell versteht und mit denen PowerShell arbeiten kann. Entwickler müssen dies nicht sagen, und wir werden dies nicht erklären.
    Wenn Sie ein benutzerdefiniertes Objekt erstellen, können Sie dem Hauptprinzip folgen. Ein Skript oder eine Funktion sollte nur einen Objekttyp zurückgeben, der beispielsweise auf der Grundlage mehrerer verschiedener WMI-Aufrufe erstellt wurde. Wenn Sie Informationen anzeigen möchten, die aus mehreren Quellen stammen, müssen Sie ein Objekt erstellen, in das Sie diese Informationen einfügen möchten. Lassen Sie uns ein Skript erstellen, das nur für die Berichterstellung vorgesehen ist. Nehmen wir an, Sie möchten im Inneren nichts tun, sondern nur Daten sammeln und weitergeben.
    Wir verwenden die vier in Listing 21.1 gezeigten Befehle. Jeder der Extrakte der Daten auf Ihrem Computer (beschränken uns auf localhost, kann aber auf jedem Computer arbeiten).

    Tipp: Wenn Sie eine Funktion mit dem Computernamen als Parameter erstellen, verwenden Sie standardmäßig $ Env: COMPUTERNAME , nicht localhost oder "." . Es gibt Fälle, in denen ein Computername erforderlich ist, den Sie sofort aus der Umgebungsvariablen abrufen und zusätzliche Schritte im Code speichern können.

    Sie möchten nicht alle diese Informationen anzeigen, sondern benötigen nur einen Teil der vier Schlussfolgerungen. In Listing 21.1 erhalten wir die Daten und setzen sie in Variablen um, wir produzieren keine Ausgabe. Dies ist ein unveränderlicher Code, den wir zum weiteren Erstellen von Objekten auf verschiedene Arten verwenden werden.

    Listing 21.1: Befehle starten
    $os = Get-WmiObject –Class Win32_OperatingSystem –comp localhost
    $cs = Get-WmiObject –Class Win32_ComputerSystem –comp localhost
    $bios = Get-WmiObject –Class Win32_BIOS –comp localhost
    $proc = Get-WmiObject –Class Win32_Processor –comp localhost | Select –First 1
    

    Das letzte der vier Teams ist etwas anders. Die ersten drei sind das Betriebssystem, das Computersystem und das BIOS. Sie existieren per Definition in einer Instanz, der Prozessor kann oft mehr als eins sein. Da alle Prozessoren gleich sind, wählen wir Select - First 1 . Windows Server 2003 und Windows XP geben eine Instanz der Klasse Win32_Processor an den Kernel zurück. Beachten Sie daher, dass die Ergebnisse der Verwendung dieser Klasse von der Version des Betriebssystems abhängen.

    Hinweis Ein Fix für dieses Problem ist im Hotfix für Windows Server 2003 unter support.microsoft.com/kb/932370 verfügbar. Angesichts der begrenzten verbleibenden Zeit im Lebenszyklus dieses Produkts ist eine Installation möglicherweise nicht angebracht.

    Somit enthält jede unserer vier Variablen ein Objekt. Dies ist wichtig für die nächste Technik, die wir betrachten werden.
    Tipp. In PowerShell 3 und 4 können Sie die CIM- Cmdlets (Common Information Model) anstelle von WMI- Cmdlets verwenden . In dem Beispiel in diesem Kapitel spielt es keine Rolle, wie Sie die Daten erhalten - über WMI oder CIM.

    Das Einfügen eines
    PowerShell- Übersetzers ohne WMI ist nicht vollständig. Wenn Sie WMI (oder CIM) in Verbindung mit der Remote-Ausführung von Befehlen verwenden, wird die gesamte Leistung eines Posiks sichtbar. Laut Siddevay verliert der Administrator bis zu 60% der Macht der Sprache, wenn er den Send kennt, aber WMI nicht kennt. Ich weiß nicht, wie es berechnet wird.

    Die Variablen sind also voll, und wir können sie in unseren Code einbetten.

    Fortsetzung

    Jetzt auch beliebt: