Das Verwalten von Systemen kann sich anfühlen wie das Jonglieren mit zu vielen Bällen auf einmal. In einem Moment behebst du ein Speicherproblem, im nächsten jagst du Prozessor-Spezifikationen nach oder überprüfst die Speicherkapazität. Dies manuell zu tun, ist nicht nur mühsam, sondern auch fehleranfällig. Wenn du in diesem Zyklus feststeckst, ist es an der Zeit, dem Wahnsinn ein Ende zu setzen. Automatisierung ist deine Lösung!
In diesem Leitfaden erfährst du, wie du PowerShell-Funktionen erstellst, um deine Workflows zu optimieren und dich auf das Wesentliche zu konzentrieren.
Genieße eine Reihe leistungsstarker Skripte in deinem Toolkit, die dir Zeit sparen und dir helfen, wie ein Profi zu arbeiten!
Erstellen von Funktionen zum Extrahieren von Informationen
Im Verlauf des Moduls füllen wir die Eigenschaft Info
mit Hardware-Informationen mithilfe des Cmdlets Get-CimInstance
. Dieser Ansatz ermöglicht es uns, Code effektiv zu standardisieren und wiederzuverwenden.
Die folgenden Funktionen sammeln Speicher-, Speicher- und Prozessorinformationen aus einer entfernten Sitzung:
function Get-MemoryInfo { [CmdletBinding()] param( [Parameter(Mandatory)] [System.Management.Automation.Runspaces.PSSession]$Session ) $outObject = @{ 'ComputerName' = $Session.ComputerName 'HardwareCategory' = 'Memory' 'Info' = $null } $scriptBlock = { Get-CimInstance -ClassName Win32_PhysicalMemory } $result = Invoke-Command -Session $Session -ScriptBlock $scriptBlock $outObject['Info'] = $result [pscustomobject]$outObject } function Get-StorageInfo { [CmdletBinding()] param( [Parameter(Mandatory)] [System.Management.Automation.Runspaces.PSSession]$Session ) $outObject = @{ 'ComputerName' = $Session.ComputerName 'HardwareCategory' = 'Storage' 'Info' = $null } $scriptBlock = { Get-CimInstance -ClassName Win32_LogicalDisk } $result = Invoke-Command -Session $Session -ScriptBlock $scriptBlock $outObject['Info'] = $result [pscustomobject]$outObject } function Get-ProcessorInfo { [CmdletBinding()] param( [Parameter(Mandatory)] [System.Management.Automation.Runspaces.PSSession]$Session ) $outObject = @{ 'ComputerName' = $Session.ComputerName 'HardwareCategory' = 'Processor' 'Info' = $null } $scriptBlock = { Get-CimInstance -ClassName Win32_LogicalDisk } $result = Invoke-Command -Session $Session -ScriptBlock $scriptBlock $outObject['Info'] = $result [pscustomobject]$outObject }
Transformieren der Ausgabe
Die Rohdaten, die von Systemabfragen abgerufen werden, enthalten oft mehr Details als notwendig, was die Interpretation erschwert. Diese Situation kann zu Ineffizienzen führen, wenn man sich auf bestimmte, handlungsrelevante Attribute konzentriert.
Um die Daten zu standardisieren, kannst du die Ausgabe von Get-CimInstance
in ein benutzerdefiniertes Objekt transformieren.
Hier ist eine aktualisierte Version:
function Get-MemoryInfo { [CmdletBinding()] param( [Parameter(Mandatory)] [System.Management.Automation.Runspaces.PSSession]$Session ) $outObject = @{ 'ComputerName' = $Session.ComputerName 'HardwareCategory' = 'Memory' 'Info' = $null } $scriptBlock = { Get-CimInstance -ClassName Win32_PhysicalMemory } $result = Invoke-Command -Session $Session -ScriptBlock $scriptBlock $info = $result | ForEach-Object { [pscustomobject]@{ 'LocatorId' = $_.DeviceLocator 'Capacity' = $_.Capacity } } $outObject['Info'] = $info [pscustomobject]$outObject } function Get-StorageInfo { [CmdletBinding()] param( [Parameter(Mandatory)] [System.Management.Automation.Runspaces.PSSession]$Session ) $outObject = @{ 'ComputerName' = $Session.ComputerName 'HardwareCategory' = 'Storage' 'Info' = $null } $scriptBlock = { Get-CimInstance -ClassName Win32_LogicalDisk } $result = Invoke-Command -Session $Session -ScriptBlock $scriptBlock $info = $result | ForEach-Object { [pscustomobject]@{ 'VolumeName' = $_.VolumeName 'VolumeLetter' = $_.DeviceId 'VolumeCapacity' = $_.Size 'VolumeFreeSpace' = $_.FreeSpace } } $outObject['Info'] = $info [pscustomobject]$outObject }
Umgang mit Byte-Werten
Hardwareinformationen enthalten oft numerische Werte wie Speicher- oder Speicherkapazität in Bytes. Obwohl technisch korrekt, könnten diese Werte für eine schnelle Interpretation praktischer sein. Die Umwandlung in Gigabyte ermöglicht ein intuitiveres Verständnis der Hardwaremetriken.
Für eine bessere Lesbarkeit macht die Hilfsfunktion ConvertTo-Gb
diesen Prozess effizient:
function ConvertTo-Gb { [CmdletBinding()] param( [Parameter(Mandatory)] [string]$Bytes ) $numberGb = $Bytes / 1GB [math]::Round($numberGb, 2) } function Get-MemoryInfo { [CmdletBinding()] param( [Parameter(Mandatory)] [System.Management.Automation.Runspaces.PSSession]$Session ) $outObject = @{ 'ComputerName' = $Session.ComputerName 'HardwareCategory' = 'Memory' 'Info' = $null } $scriptBlock = { Get-CimInstance -ClassName Win32_PhysicalMemory } $result = Invoke-Command -Session $Session -ScriptBlock $scriptBlock $info = $result | ForEach-Object { [pscustomobject]@{ 'LocatorId' = $_.DeviceLocator 'Capacity' = (ConvertTo-Gb -Bytes $_.Capacity) } } $outObject['Info'] = $info [pscustomobject]$outObject }
Dieser Ansatz verbessert die Funktionalität und Lesbarkeit der von diesen Funktionen zurückgegebenen Daten. Zukünftige Updates oder Änderungen werden durch die Zentralisierung wiederkehrender Logik in Hilfsfunktionen wie ConvertTo-Gb
leichter handhabbar.
Fazit
Sie haben gelernt, wie Sie PowerShell-Funktionen mithilfe der in diesem Leitfaden beschriebenen Schritte erstellen können. Sei es das Sammeln von Hardwareinformationen von Remote-Systemen, die Umwandlung von Rohdaten in strukturierte benutzerdefinierte Objekte oder die Verbesserung der Datenlesbarkeit.
Nun, da Sie diese Techniken beherrschen, überlegen Sie, wie Sie auf diesem Fundament aufbauen können. Sie könnten beispielsweise weitere Hardwarekategorien zu Ihrem Modul hinzufügen, wie Netzwerkadapter oder GPU-Informationen. Sie könnten diese Funktionen auch in größere Automatisierungsworkflows integrieren, wie z.B. Systemüberwachung oder Bestandsverwaltung.
Die Möglichkeiten sind endlos, und Sie sind auf dem besten Weg, ein robustes Werkzeugset zur selbstbewussten Verwaltung Ihrer Systeme aufzubauen.
Source:
https://adamtheautomator.com/powershell-functions-module/