Hallo zusammen,
Im fünften Teil meiner Grundlagenserie, zeige ich euch, wie Ihr mit Variablen umgehen könnt.
Über das Thema Variablen kann man sehr dicke Bücher verfassen, daher reiße ich das Thema nur kurz an, um euch einen kleinen Überblick zu geben was möglich wäre.
Sollte mal was unklar sein, könnt ihr hier nachschlagen.
1 2 3 4 5 |
Get-Help about_Variables Get-Help about_Automatic_Variables Get-Help about_Environment_Variables Get-Help about_Preference_Variables Get-Help about_CommonParameters |
Um sich die Systemvariablen anzeigen zu lassen, kann man folgende Befehle nutzen:
1 2 3 4 5 |
Get-Variable oder Get-ChildItem Variable: | Format-Table Name, Description -AutoSize |
Die Environment/Umgebungsvariablen zeigt man sich wie folgt an:
1 |
Get-ChildItem Env: | Sort-Object Name |
Bestimmte Environment/Umgebungsvariablen kann man sich anzeigen lassen, indem man Env „:“ gefolgt vom Variablenamen angibt oder das Dollarzeichen „$“ davorsetzt $Env:gefolgt vom Variablenamen
1 2 3 4 5 6 7 8 9 10 |
Get-ChildItem Env:Computername oder $Env:Computername oder Set-Location Env: Get-ChildItem ComputerName |
Um auf Verzeichnisvariablen zugreifen zu können, benutzt man folgende Befehle:
1 2 3 |
Get-ChildItem $Env:ProgramFiles Get-ChildItem $Env:ProgramData Get-ChildItem $Env:ALLUSERSPROFILE |
Bei 64-Bit Systemen gibt es ein Ausgabeproblem bei der Variable %ProgramFiles(x86)%, wegen der beiden Klammern um x86.
Diese Abfrage fasst man einfach in geschweifte Klammern zusammen.
1 |
Get-ChildItem ${Env:ProgramFiles(x86)} |
Wenn man bei Environment/Umgebungsvariablen etwas hinzufügen möchte, bestes Beispiel wäre die Path Variable, funktioniert das wie folgt. Dies gilt aber nur für die aktive Powershellsitzung.
1 2 |
$Env:Path $Env:Path = $Env:Path + ";C:\Temp" + ";D:\PowershellScripte" |
Wenn man feste Werte setzen möchte, muss man das über das PowerShell-Profil realisieren. Mit folgenden cmdlet wird die Path-Erweiterung gleich in die Profildatei geschrieben.
1 |
Add-Content -Path $Profile.CurrentUserAllHosts -Value '$Env:Path = $Env:Path + ";C:\Temp" + ";D:\PowershellScripte"' |
Oder folgenden Eintrag an das Ende der Profildatei schreiben.
1 2 |
notepad $Profile.CurrentUserAllHosts $Env:Path = $Env:Path + ";C:\Temp" + ";D:\PowershellScripte" |
Um selbst Variablen für die jeweilige Powershellsitzung zu erstellen, schreibt man $VariableName = Zuordnung
1 2 |
$zahl = 5 $text = "Hallo Welt" |
Um eine Variable fest zu definieren, dass heißt in dieser Variable dürfen z.B. nur Ganzzahlen [integer] geschrieben werden, setzt man vor den Variablenamen ein [int],
nachdem die Variable definiert wurde und man versucht diese z.B. mit Text [string] zu überschreiben, bekommt man einen Fehlermeldung angezeigt.
1 2 3 4 5 6 7 8 9 10 11 |
[int]$zahl = 5 $zahl 5 $zahl = "Hallo Welt" Der Wert "Hallo Welt" kann nicht in den Typ "System.Int32" konvertiert werden. Fehler: "Die Eingabezeichenfolge hat das falsche Format." In Zeile:1 Zeichen:1 + $zahl = "Hallo Welt" $zahl | Get-Member (TypeName: System.Int32) |
Andersherum ist der String-Variable egal ob Text oder Zahlen enthalten sind, die Zahlen werden dann einfach als Text behandelt.
1 2 3 4 5 6 7 8 9 |
[string]$text = "Hallo Welt" $text Hallo Welt $text = '123' $text 123 $text | Get-Member (TypeName: System.String) |
Folgende Datentypen können für Variablen definiert werden.
1 2 3 4 5 6 7 8 9 10 |
[datetime] Datum oder Zeit [string] Zeichenfolge [char] Einzelnes Zeichen [double] Gleitzahl mit doppelter Genauigkeit [single] Gleitzahl mit einfacher Genauigkeit [int] 32-Bit ganze Zahl [wmi] Windows Management Instrumentation (WMI) Instanz oder Sammlung [adsi] Active Directory-Dienstobjekt [wmiclass] WMI-Klasse [Boolesch] Wahrer oder Falscher Wert |
Man kann natürlich auch kleine Rechenaufgaben mit Hilfe von Variablen erledigen lassen. 🙂
1 2 3 4 |
$rechnung = 100 $mwst = 100 * 0.19 $endsumme = $rechnung + $mwst Write-Host "Mensch, das Abendessen hat heute $endsumme Euro gekostet!" |
Oder ganze Abfragen in einer Variable schreiben lassen und diese später wieder auswerten oder weiterverarbeiten.
1 2 |
$timedate = Get-Date -Format "dd-MM-yyyy_HH-mm-ss" $computers = Get-ADComputer -filter "Name -like '*'" -properties OperatingSystem,OperatingSystemServicePack,OperatingSystemVersion,IPv4Address,Created | Sort-Object |
Spezielle Variablen kann man wie folgt definieren. Ob es Sinnvoll ist, muss jeder für sich selbst entscheiden. 🙂
1 |
${ein sonderbarer, aber */() möglicher Variablenname} = 12 |
Array’s definiert man wie folgt.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
##Zahlen-Array's erstellen $ZahlenArray = 1,2,3 ##Ausgabe des Array's = $ZahlenArray; $ZahlenArray[0]; $ZahlenArray[1]; $ZahlenArray[2] $ZahlenArray = '4', '5', '6' $ZahlenArray = "7", "8", "9" $ZahlenArray = @("10", "11", "12") $ZahlenArray ##String-Array's erstellen $StringArray = 'Wert 1', 'Wert 2', 'Wert 3' $StringArray = Write-Output 'Wert 4' 'Wert 5' 'Wert 6' $StringArray = 'Wert 7,Wert 8,Wert 9'.Split(',') $StringArray = @("Wert 10", "Wert 11", "Wert 12") $StringArray ##Einträge im Array können wie folgt verändert werden $StringArray[2] = "Wert 14" $StringArray ##Möchte man die Ausgabe bestimmter oder aller Werte in einer Array manipulieren, hilft wieder das cmdlet Get-Member $StringArray | Get-Member $StringArray[1].ToLower() $StringArray.ToUpper() $StringArray.Replace("Wert 10", "Wert 15") |
Sucht man nach bestimmten Strings oder Zeichenketten in einer Variable, helfen die Methoden (Get-Member)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
$uncPath = "\\Servername\Freigabe" $uncPath $uncPath.StartsWith("\\") True if ($uncPath.StartsWith("\\") -eq $True) { Write-Host "Der UNC Pfad beginnt mit '\\'" } else { Write-Host "Der UNC Pfad beginnt leider nicht mit '\\'" } $uncPath.EndsWith("Freigabe") True $uncPath.EndsWith("e") True $uncPath.EndsWith("f") False |
Um Hash-Table’s erstellen zu können, benötigt man einen Namen und ein Value als Zuordnung. Es gibt verschiedene Möglichkeiten die Wertepaare in einer Hash-Table abzulegen.
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 |
$cplist1 = @{ComputerName = "CLN01"; IPAddress="192.168.100.111"; UserName="Peter Pan"; Standort="Berlin"; Domain="htdom.local"} oder $cplist2 = @{} #Leere Hash-Table erstellen $cplist2.ComputerName = "CLN01" $cplist2.IPAddress = "192.168.100.111" $cplist2.UserName = "Peter Pan" $cplist2.Standort = @("Berlin") $cplist2["Domain"] = "htdom.local" ##Werte aus einer Hash-Table abfragen $cplist2 $cplist2["UserName"] $cplist2.UserName $cplist2["UserName", "ComputerName", "Standort"] ##Einträge aus einer Hash-Table wieder löschen $cplist2.Remove("Domain") ##Hash-Table komplett leeren, zurück bleibt die leere Variable $cplist2.Clear Get-Variable ... cplist2 {} ##Diese leere Variable kann man mit Remove-Variable löschen Remove-Variable cplist2 |
Noch ein Beispiel für eine Hash-Table
1 2 3 4 5 6 7 8 9 10 |
$hash = $null $hash = @{} $services = Get-Service | Sort-Object Name ForEach ($service in $services) {$hash.add($service.Name,$service.Status)} Clear-Host $hash $hash["BITS"] $hash["BITS", "VSS"] |
Und sollten mehrere Werte in das Value Feld eingetragen werden, würde es mit diesen Beispiel funktionieren.
Die Werte im Value Feld lassen sich aber nicht mehr so leicht verändern wie oben in den Beispielen gezeigt, hier müssten die kompletten Werten gelöscht und mit neuen Werten hinzugefügt werden.
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 33 34 35 36 37 38 |
$Users = @{} $Users.Administrator += @("DOMAIN\Administrator") $Users.Administrator += @("DOMAIN") $Users.Administrator += @("S-1-5-21-3775395870-3833774050-3544682504-500") $Users.Gast += @("DOMAIN\Gast") $Users.Gast += @("DOMAIN") $Users.Gast += @("S-1-5-21-3775395870-3833774050-3544682504-501") $Users Name Value ---- ----- Administrator {DOMAIN\Administrator, DOMAIN, S-1-5-21-3775395870-3833774050-3544682504-500} Gast {DOMAIN\Gast, DOMAIN, S-1-5-21-3775395870-3833774050-3544682504-501} $Users["Administrator"] DOMAIN\Administrator DOMAIN S-1-5-21-3775395870-3833774050-3544682504-500 $Users["Gast"] DOMAIN\Gast DOMAIN S-1-5-21-3775395870-3833774050-3544682504-501 $Users.Remove("Gast") $Users Name Value ---- ----- Administrator {DOMAIN\Administrator, DOMAIN, S-1-5-21-3775395870-3833774050-3544682504-500} $Users.Clear Get-Variable ... Users {} Remove-Variable Users |
So das war es erst mal wieder von mir.
Wünsche viel Spaß und viele Grüße
Helmut