Dieses PowerShell Script kann mehr oder weniger automatisch die Festplattengrößen und deren Belegung von mehreren Server ermitteln. Die Ergebnisse werden in eine Exceltabelle geschrieben. Dazu wird eine auf die jeweilige Umgebung leicht anpassbare Excel-Vorlage benötigt. Die Excelvorlage können Sie am Ende dieses Beitrags herunterladen. Zunächst definieren wir unser Umgebung:
$server1 = "P804VOE010" # Array der zu untersuchenden server $server = 0..14 $Filepath ="D:\temp\Excel\" $ExcelFile =$Filepath + "PlattenKapazitaet1.xlsx" $TableName1 = $server1
In Zeile 1 geben wir den Namen des Servers an auf dem das Script läuft oder getestet wird. Zeile 3 belegt die Array-Variable $server mit Dummy-Inhalten. In den Zeilen 4 und 5 benennen wir die zuvor angelegten und mit entsprechenden Rechten ausgestatteten Speicherorte unseres Scripts sowie der Excel-Definitions- und Ergebnisdatei.
Als erstes werden mit der nachstehenden Funktion die gewünschten Server aus der Excelvorlage ausgelesen.
function ServerListeAusTab { # Beteilgte Server aus Tab Server auslesen # Variable $TableName="Server" [int]$Zeile = 1 [int]$Spalte = 1 #Instanzieren eines COM-Objektes für Excel $Excel = New-Object -ComObject excel.application #Excel-Sheet sichtbar machen, heißt, ob es im Vordergrund oder im Hintergrund geschehen soll. $Excel.Visible = $false # Arbeitsmappe laden $Workbook = $Excel.Workbooks.Open($ExcelFile) $Table =$workbook.Worksheets.Item($TableName) # Datei auslesen und zu untersuchende Server ermitteln und in das Array $server[x] schreiben do { $Data = $Table.Cells.Item($Zeile,$Spalte).Text $server[$Zeile-1]=$Data echo $server[$Zeile-1] $Zeile++ } while($Table.Cells.Item ($Zeile,$Spalte).Text.Length -gt 0) echo "Speichern und Schliessen Serverliste" $Excel.DisplayAlerts=$False $Workbook.SaveAs($ExcelFile) #COM-Objektes beenden $Excel.Quit() #COM-Objektes aus dem Speicher entfernen [System.Runtime.Interopservices.Marshal]::Release ComObject($excel) # Ende der Funktion Server-Liste aus Tab }
In der vorstehenden Funktion werden aus der Excel-Vorlage aus dem Tab Server und von dort aus der ersten Spalte die Namen der zu untersuchenden Server ausgelesen. Ab Zeile 9 werden die Variable für Namen des Tabs sowie die Startpunkte für Zeile und Spalte definiert. Ab Zeile 13 wird die Arbeitsmappe im Hintergrund geöffnet. Ab Zeile 20 werden in einer do/while-Schleife die Servernamen aus dem Tab Server ausgelesen und in das Array $server[0] bis [$Zeile-1] geschrieben. Und das solange die Länge des Servernamens > 0 ist. Die echo-Ausgaben dienen lediglich dem besseren Verständnis und Kontrollzwecken. Ab Zeile 27 wird die Excel-Arbeitsmappe wieder geschlossen.
Damit alles wie geplant funktioniert, ist die Excel-Vorlage so zu bearbeiten, dass Sie für jeden Server ein eigener vorformatierter Tab mit dem gleichem Namen des jeweiligen Servers enthalten ist.
Nachstehende Bilder soll dies verdeutlichen.
Die folgende Funktion ermittelt die Plattengrößen, sowie den freien Speicherbereich pro Festplatte und schreibt die Ergebnisse pro Server in den gleichnamigen Tab der Excelvorlage.
# Freie Zeile im Tab $server1 ermitteln echo $ExcelFile # Variablen [int]$Zeile = 2 # ab 2, da in Zeile 1 die Titel stehen [int]$Spalte = 1 $TableName1 = $server1 #Instanzieren eines COM-Objektes für Excel $Excel = New-Object -ComObject excel.application #Excel-Sheet sichtbar machen, heißt, ob es im Vordergrund oder im Hintergrund geschehen soll. $Excel.Visible = $false #Arbeitsmappe laden $Workbook = $Excel.Workbooks.Open($ExcelFile) $Table =$workbook.Worksheets.Item($TableName1) # Datei auslesen und erste Freie Zelle in Spalte 1 ermitteln do { $Data = $Table.Cells.Item($Zeile,$Spalte).Text $Zeile++ } while($Table.Cells.Item($Zeile,$Spalte).Text.Length -gt 0) echo (&quot;Tabelle &quot; + $TableName1) echo (&quot;Spalte &quot;+ $Spalte) echo (&quot;Freie Zeile &quot; + $Zeile) $Inhalt1 = &quot;Festplatten auf Server &quot; $Inhalt1 = $Inhalt1 + $server1 $Inhalt1 = $Inhalt1 + $date1 + &quot;<code>r</code>n&quot; $i=0 $datum1 = (Get-Date).ToShortDateString() $zeit1 = (Get-Date).ToShortTimeString() $date1 = &quot; Datum: &quot; + $datum1 + &quot; Zeit: &quot; + $zeit1 + &quot; Uhr&quot; # echo $date1 #$frei1 = Get-WmiObject -Class Win32_LogicalDisk -computer $server1 -Filter &quot;DriveType=3&quot; | Format-Table @{Label=&quot;Drive&quot;; Expression={$_.DeviceID}; width=8}, @{Label=&quot;Size&quot;; Expression={$_.Size / 1GB}; Format=&quot;000.0&quot;; width=8}, @{Label=&quot;GB Free&quot; ; Expression={$_.FreeSpace/1GB} ; Format=&quot;000.0&quot; ; width=8} , @{Label=&quot;% Free&quot; ; Expression={$_.FreeSpace * 100 /$_.Size}; Format=&quot;00.0&quot; ; width=10} $frei1 = Get-WmiObject -Class Win32_LogicalDisk -computer $server1 -Filter &quot;DriveType=3&quot; # Festplatten pro Server ForEach($frei1 in $frei1) { $Inhalt1 = $Inhalt1 + &quot;Device &quot; + $frei1.DeviceID + &quot; - Size &quot; + (&quot;{0:N2}&quot; -f ($frei1.Size / 1GB )) + &quot; GB - Free &quot; + (&quot;{0:N2}&quot; -f ($frei1.FreeSpace / 1GB)) + &quot; GB&quot; + &quot;<code>r</code>n&quot; $Table.Cells.Item($Zeile,1) = $server1 $Table.Cells.Item($Zeile,2) = $datum1 $Table.Cells.Item($Zeile,3) = $Zeit1 $Table.Cells.Item($Zeile,4+$i) = $frei1.DeviceID $Table.Cells.Item($Zeile,5+$i) = (&quot;{0:N2}&quot; -f ($frei1.Size / 1GB )) $Table.Cells.Item($Zeile,6+$i) = (&quot;{0:N2}&quot; -f ($frei1.FreeSpace / 1GB)) $i=$i+4 } echo &quot;Speichern und Schliessen&quot; $Excel.DisplayAlerts=$False $Workbook.SaveAs($ExcelFile) #COM-Objektes beenden $Excel.Quit() #COM-Objektes aus dem Speicher entfernen [System.Runtime.Interopservices.Marshal]::ReleaseComObject($excel) echo $Inhalt1 # Ende Funktion PlattenSize }
Ab der Zeile 37 werden die Variablen definiert und ab der Zeile 45 wird die Excel Arbeitsmappe im Hintergrund geöffnet. Ab Zeile 53 wird die erste freie Zeile in der do/while-Schleife ermittelt. Die Zeilen 60 bis 67 dienen lediglich Verständnis und Kontrollzwecken bei der manuellen Ausführung des PowerShell Scripts. Ab der Zeile 69 wird das Datum zur Ausführungzeit ermittelt und formatiert der Variablen $datei1 zugewiesen. Zeile 75 bedient sich zum Ermitteln der interessierenden Festplatten dem Befehl Get-WmiObject. Dabei werden als Parameter der Servername und der Festplattentyp übergeben. Die Ergebnisse stehen dann im Array ab $frei1[0] zur Verfügung und werden in ForEach-Schleife Zeile 78 bis 89 pro Festplatte des Servers abgefragt. Zeile 79 dient wieder zu Kontrollzwecken. Die Zeilen 81 bis 88 beschrieben den Tab des jeweiligen Servers $server1. Ab Zeile 91 wird die Excel Arbeitsmappe wieder geschlossen.
Das Main Programm ruft die Funktionen ServerListeAusTab als erstes in Zeile 103 auf. Danach wird die Funktion PlattenSize in der do/while-Schleife solange auf gerufen, bis alle erreichbaren Server (Zeile 108) abgearbeitet sind.
echo "main" ServerListeAusTab $j=0 do { $server1 = $server[$j] echo $server1 $ServerErreichbar = Test-Connection -computername $server1 -quiet if ($ServerErreichbar) { PlattenSize } else { #nix } echo ("Zähler " + $j) echo ("Länge Servername " + $server[$j].Length) $j++ } while($server[$j].Length -gt 0) echo "ende main" # ********************
Über die Aufgabenplanung kann das Script regelmäßig aufgerufen werden und damit die Festplattenkapazitäten regelmäßig protokolliert werden.
Folgende anpassbare Excel-Vorlage wird benötigt und kann hier heruntergeladen werden. [wpdm_file id=1] Das Password kann beim Autor hier angefordert werden.
Der zweite Download enthält die Excel-Vorlage und das PowerShell Script aus einem angepasstem Projekt in gezippter Form.[wpdm_file id=2]Das Password kann beim Autor hier angefordert werden.