Hallo zusammen,
Im vierten Teil meiner Grundlagenserie zeige ich euch wie ein cmdlet Befehl aufgebaut ist und wie Ihr PowerShell für die tägliche Arbeit nutzen könnt.
Die PowerShell Syntax sieht wie folgt aus = Verb Bindestrich „-“ Substantiv -Parameter Attribut, das ganze in Englisch und in der Einzahl.
Es gibt kein Get-Members/Get-Processes/Get-Services, sondern nur ein Get-Member/Get-Process/Get-Service
Alle Parameter, die man dem cmdlet mit gibt, kann man bis auf ein Zeichen nach dem Bindestrich „-“ abkürzen, solange es keinen weiteren Parameter mit demselben Buchstaben gibt.
Bestes Beispiel wäre jetzt hier das cmdlet Get-ChildItem, hier gibt es als Parameter -Filter -File -Force
Die gekürzte Version würde jetzt wie folgt aussehen: Get-ChildItem -Filt BlaBlaBla -File BlaBlaBla -Fo
Persönlich schreibe ich aber die Parameter aus, dann kann nichts schief gehen und jeder der das Skript liest, weiß was gemeint ist.
Auch ist es möglich die Parameter ganz weg zu lassen, dann muss aber die Reihenfolge der Parameter eingehalten werden. Die Reihenfolge könnt Ihr euch anzeigen lassen, indem Ihr Get-Help cmdlet aufruft.
Powershell Verben:
Get- besorgt Informationen
Set- ändert Informationen
Add- fügt neue Informationen hinzu
Remove- löscht Informationen
Eine Beschreibung aller PowerShell Verben findet ihr auf der MSDN Seite von Microsoft oder mit dem cmdlet Get-Verb
http://msdn.microsoft.com/en-us/library/ms714428%28v=vs.85%29.aspx
Powershell Substantiv:
Help
Member
Service
Command
So dann wollen wir mal loslegen, jede gute Programmiersprache beginnt mit einem „Hello World“, Powershell beginnt meistens mit Get-Process oder Get-Service, dem schließe ich mich jetzt an.
Ich lass mir mal alle meine lokalen Dienste anzeigen:
1 |
Get-Service |
Um mir alle Dienste nach Namen/Status/DisplayName zu sortieren, benutze ich die Pipeline „|“ und das cmdlet Sort-Object
1 2 3 |
Get-Service | Sort-Object Name Get-Service | Sort-Object Status Get-Service | Sort-Object DisplayName |
Um nach bestimmten Diensten zu suchen die ein „win“ in Ihren Namen haben, benutze ich folgende Abfrage
1 |
Get-Service -Name *win* |
Mit folgendem Befehl finde ich heraus mit welchen zusätzlichen Eigenschaften ich die Dienste noch abfragen kann. Besonderes Augenmerk sind die Property’s
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
Get-Service | Get-Member TypeName: System.ServiceProcess.ServiceController Name MemberType Definition ---- ---------- ---------- Name AliasProperty Name = ServiceName RequiredServices AliasProperty RequiredServices = ServicesDependedOn ... CanPauseAndContinue Property bool CanPauseAndContinue {get;} CanShutdown Property bool CanShutdown {get;} CanStop Property bool CanStop {get;} Container Property System.ComponentModel.IContainer Container {get;} DependentServices Property System.ServiceProcess.ServiceController[] DependentServices {get;} DisplayName Property string DisplayName {get;set;} MachineName Property string MachineName {get;set;} ServiceHandle Property System.Runtime.InteropServices.SafeHandle ServiceHandle {get;} ServiceName Property string ServiceName {get;set;} ServicesDependedOn Property System.ServiceProcess.ServiceController[] ServicesDependedOn {get;} ServiceType Property System.ServiceProcess.ServiceType ServiceType {get;} Site Property System.ComponentModel.ISite Site {get;set;} Status Property System.ServiceProcess.ServiceControllerStatus Status {get;} |
Um mir die Eigenschaften einer Abfrage anzeigen zu lassen, muss diese Abfrage in Klammern gesetzt werden, plus einen Punkt und die dazugehörige Eigenschaft.
Hinter der Eigenschaft sieht man auch in geschweiften Klammern {get;set;}. Das bedeutet, dass diese Eigenschaft bei Get und Set Abfragen benutzt werden kann.
1 2 3 |
(Get-Service Adobe*).CanPauseAndContinue False False |
1 2 3 4 5 6 |
Get-Service Adobe* | Format-List -Property Name,CanPauseAndContinue Name : AdobeARMservice CanPauseAndContinue : False Name : AdobeFlashPlayerUpdateSvc CanPauseAndContinue : False |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
Get-Service Adobe* | Format-List -Property * Name : AdobeARMservice RequiredServices : {} CanPauseAndContinue : False CanShutdown : False CanStop : True DisplayName : Adobe Acrobat Update Service DependentServices : {} MachineName : . ServiceName : AdobeARMservice ServicesDependedOn : {} ServiceHandle : SafeServiceHandle Status : Running ServiceType : Win32OwnProcess Site : Container : Name : AdobeFlashPlayerUpdateSvc RequiredServices : {} CanPauseAndContinue : False CanShutdown : False CanStop : False DisplayName : Adobe Flash Player Update Service DependentServices : {} MachineName : . ServiceName : AdobeFlashPlayerUpdateSvc ServicesDependedOn : {} ServiceHandle : SafeServiceHandle Status : Stopped ServiceType : Win32OwnProcess Site : Container : |
Um Dienste mit der Powershell starten und stoppen zu können, benutzt man das cmdlet Start/Stop-Service
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
Get-Service -Name AdobeARMservice Status Name DisplayName ------ ---- ----------- Running AdobeARMservice Adobe Acrobat Update Service Stop-Service -Name AdobeARMservice; Get-Service -Name AdobeARMservice Status Name DisplayName ------ ---- ----------- Stopped AdobeARMservice Adobe Acrobat Update Service Start-Service -Name AdobeARMservice; Get-Service -Name AdobeARMservice Status Name DisplayName ------ ---- ----------- Running AdobeARMservice Adobe Acrobat Update Service |
Noch ein schönes Feature ist das cmdlet Out-GridView
1 |
Get-Service | Out-GridView |
Um den Starttyp von einen Dienst zu verändern, benutzt man das cmdlet Set-Service
1 |
Set-Service -Name AdobeARMservice -StartupType Manual |
Leider gibt es aber keine Eigenschaft für das cmdlet Get-Service, die mir den Starttyp eines Dienstes zurückgibt. Hier muss man sich mit dem cmdlet Get-WmiObject weiterhelfen.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
(Get-WmiObject Win32_Service -filter "Name='AdobeARMservice'").StartMode Manual oder Get-WmiObject -Query "Select StartMode From Win32_Service Where Name='AdobeARMservice'" Get-WmiObject -Class Win32_Service -Property StartMode -Filter "Name='AdobeARMservice'" __GENUS : 2 __CLASS : Win32_Service __SUPERCLASS : __DYNASTY : __RELPATH : __PROPERTY_COUNT : 1 __DERIVATION : {} __SERVER : __NAMESPACE : __PATH : StartMode : Manual PSComputerName : |
Mit folgender Abfrage kann man sich alle Dienste anzeigen lassen, die gestoppt bzw. gestartet sind.
1 2 |
Get-Service | Where-Object {$_.Status -eq "Stopped"} Get-Service | Where-Object {$_.Status -eq "Running"} |
Nun bringen wir ein bisschen Farbe ins Spiel, mit folgender Abfrage kann man sich die Dienste je nach Status farbig hervorheben lassen.
Dazu gibt es ein weiteres cmdlet Write-Host mit der Eigenschaft -ForegroundColor.
1 |
Get-Service | ForEach-Object{if($_.Status -eq "Stopped"){Write-Host $_.Name $_.Status -ForegroundColor red} else {Write-Host $_.Name $_.Status -ForegroundColor green}} |
Um sich das ganze in eine HTML Datei exportieren zu lassen, benutzt man folgende Abfrage.
1 2 3 |
$datetime = get-date -uformat "%d-%m-%Y_%H-%M-%S" Get-Service -ComputerName localhost | ConvertTo-Html -Property DisplayName,Status | ForEach-Object {if ($_ -Like "*<td>Running</td>*") {$_ -Replace "<tr>", "<tr bgcolor=green>"} else {$_ -Replace "<tr>", "<tr bgcolor=red>"}} > D:\Dienste_$datetime.html Start D:\Dienste_$datetime.html |
Wenn unter euch ein paar Designer sind, gibt es noch einen schöneren Bericht, der die Prozesse auch gleich mitabdeckt.
Dieses CodeSnippet habe ich im Internet gefunden, leider weiß ich nicht mehr woher. (Vielen Danke an den Codeverfasser)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
#Generate our HTML Tables $FileLocation = "C:\Temp\Report.html" $Services = Get-Service | Select-Object DisplayName, Status | ConvertTo-Html -Fragment $Process = Get-Process | Select-Object Name, CPU | Sort-Object CPU -Descending | ConvertTo-Html -Fragment #Color the service column $Services = $Services | ForEach {$_ -Replace "<td>Running</td>","<td style=`"color: green`">Running</td>"} $Services = $Services | ForEach {$_ -Replace "<td>Stopped</td>","<td style=`"color: red`">Stopped</td>"} #Generate our full HTML with CSS styling $HTML = ConvertTo-Html -Body "$Services $Process" -Head "<style> body {background-color: lightblue; font-size: 12px; } table {background-color: white; margin: 5px; float: left; top: 0px; display: inline-block; padding: 5px; border: 1px solid black} tr:nth-child(odd) {background-color: lightgray} </style>" #Output to a file $HTML | Out-File $FileLocation ii $FileLocation |
Das war es erst mal wieder von mir.
Wünsche viel Spaß beim rumspielen und testen, bis die Tage.
Gruß Helmut