Präsentation herunterladen
Die Präsentation wird geladen. Bitte warten
Veröffentlicht von:Alexandra Boer Geändert vor über 8 Jahren
1
How to Pipelining DEVOP PART I: WINDOWS POWERSHELL
2
DEVOP
3
Das Monad Manifest Get Objects | Process Objects | Output Objects
4
Beispiel einer Pipeline Alle Dienste stoppen: get-service | stop-service Bestimmte Dienste stoppen: get-service –name *bits* | stop-service
5
Was geht in die Pipeline? Was übergeben wird, wird auf dem Bildschirm dargestellt, wenn ein CMDlet ausgeführt wird Ein CMDlet übergibt jedoch ein Objekt an die Pipeline Ein Objekt hat «Properties» und «Methods» (Beispiel: «Farbstift») Jedes Objekt hat unterschiedliche «Properties» und «Methods» Ein Stift hat eine Farbe und kann Schreiben Ein Fahrrad hat einen Lenker, Pedale und kann Fahren und Lenken Diese «Properties» und «Methods» können mit der Übergabe an «get- member» sichtbar gemacht werden
6
ABER: Wie funktionieren Pipelines nun wirklich?
7
Wie funktionieren Pipelines? 2 Kriterien gilt es von den CMDlets zu erfüllen: 1. Was gibt das CMDlet weiter? 2. Was nimmt das nächste CMDlet an?
8
Was kommt raus?
9
Was gibt ein CMDlet weiter? Dies kann durch das CMDlet «get-member» herausgefunden werden: ByValue ByPropertyName
10
ByValue Ist das erste Kriterium, welches geprüft wird Vergleicht den Objekttyp auf String-Basis
11
ByPropertyName Ist das zweite Kriterium, welches geprüft wird Zeigt an, welche Properties mit welchen Namen weitergegeben werden
12
Was geht rein?
13
Was nimmt das CMDlet an? Kann mit «get-help» mit dem Parameter «-full» herausgefunden werden:
14
Tipp Ermöglicht schnellere Suche in Help: get-help -ShowWindow
15
Spezialfall Nummer 1…
16
Funktioniert das? get-service | stop-process Eigentlich schon – aber es macht keinen Sinn… …aber weshalb?
17
Deshalb funktioniert das… «get-service» gibt folgendes weiter: ByValue: «ServiceController» ByPropertyName: alle Properties, u.a. auch «Name» ByValue ByPropertyName
18
Deshalb funktioniert das… «stop-process» nimmt folgendes an: ByValue: «Process» KEIN MATCH! ByPropertyName: u.a. auch «Name» MATCH!
19
Spezialfall Nummer 2…
20
…und was ist mit dem…?!? Das Ziel: Wir möchten alle Computer aufgelistet erhalten, auf welchen der BITS-Service ausgeführt wird get-adcomputer –filter * | get-service –name bits …funktioniert das so?!?
21
Leider nein… «get-adcomputer» liefert ein «ADComputer»-Objekt zurück «get-service» erwartet ein «ServiceController»-Objekt KEIN MATCH ByValue! «get-adcomputer» liefert aber ein «name»-Property zurück «get-service» kann ein «name»-Property annehmen MATCH ByPropertyName ABER: «get-service» erwartet einen Service-Namen – «get-adcomputer» liefert aber einen Computer-Namen
22
…oder doch…?!? «get-service» hat einen weiteren Parameter namens «computername» Dieser akzeptiert auch Inputs «ByPropertyValue» «get-adcomputer» liefert aber den Computernamen als Property «name», was wiederum dem «name»-Parameter von «get-service» – also dem Namen eines Dienstes – entspricht…
23
NoteProperties… Mit dem folgenden Befehl können nur bestimmte Spalten der eigentlichen Ausgabe angezeigt werden: get-service –name bits | select –property name,status Was passiert aber, wenn man sich vertippt? get-service –name bits | select –property naem,ststus Resultat: Es werden zumindest die Spaltenüberschriften ausgegeben – und was ist mit «get- member»? get-service –name bits | select –property naem,ststus | get-member Hier haben wir die «NoteProperties»… - also eigene benutzerdefinierte «Properties»
24
Wie kann uns das helfen? Was wäre, wenn wir das Property «name» von «get-adcomputer» auf «ComputerName» umbenennen könnten? get-adcomputer | select –property @{name=‘ComputerName’;expression={$_.name}} @{} definiert einen Hashtable …also eine Tabelle mit Namen und Werten (Names und Expressions) $_ bezieht sich jeweils auf das CMDlet-Objekt vor der Pipe …und dieses Objekt hat ein Property namens «name» Noch kürzer geht’s mit…: get-adcomputer | select –property @{n=‘ComputerName’;e={$_.name}}
25
…und es geht doch…! Wir fassen zusammen…: get-adcomputer | select –property @{n=‘ComputerName’;e={$_.name}} | get-service – name bits
26
Spezialfall Nummer 3…
27
Get-WMIObject «get-wmiobject» kann Informationen zum lokalen oder auch entfernten Computern anzeigen: get-wmiobject –class Win32_bios get-wmiobject –class Win32_bios –computername SRV01 …lasst uns dies für alle Computer im AD ausführen… get-adcomputer | select –property @{n=‘ComputerName’;e={$_.name}} | get-wmiobject –class Win32_bios
28
WäWäWäWääääähh…
29
Wie der (Fail!) aussieht…:
30
Der Grund dahinter… «get-wmiobject» akzeptiert keinerlei Pipeline-Inputs (gemäss «get-help»)
31
Let’s Try & Error… «get-wmiobject» akzeptiert keinerlei Pipeline-Inputs (gemäss «get-help») «get-wmiobject» möchte einfach im Parameter «ComputerName» ein paar Computernamen als String Etwa so: get-wmiobject –class Win32_bios –computername SRV01,SRV02 Wieso also nicht…: get-wmiobject –class Win32_bios –computername get-adcomputer –filter * …weil Powershell so nicht weiss, welches CMDlet zuerst ausgeführt wird… - aber wieso dann nicht so (wie früher in der Algebra – Klammern kommen zuerst)…: get-wmiobject –class Win32_bios –computername (get-adcomputer –filter *) …weil «get-adcomputer» ein «ADComputer»-Objekt zurückliefert und keinen String…
32
Let’s Try & Error… (Part II) «get-adcomputer» liefert also zu viele Informationen (Properties) zurück… - Weshalb dann nicht einfach…: get-adcomputer –filter * | select –property name …weil es dann immer noch ein «ADComputer»-Objekt ist (just pipe it to «get-member» to know it…) ;-D
33
Let’s Try & Error… (Part III) Das CMDlet «select-object» hat auch einen Parameter «expandProperty»…: get-adcomputer –filter * | select –expandproperty name …und siehe da…:
34
Die Lösung…! Die Lösung lautet also…: get-wmiobject –class Win32_bios –computername (get-adcomputer –filter * | select –expandproperty name) …aber es geht ab Powershell 3.0 noch einfacher…: get-wmiobject –class Win32_bios –computername (get-adcomputer –filter *).name
Ähnliche Präsentationen
© 2024 SlidePlayer.org Inc.
All rights reserved.