Veröffentlicht 9. April 201312 j Hallo Community, ich habe ein kleines Powershell-Skript geschrieben, was alle unsere Server durchcheckt und mir in einer Ausgabe-Datei sowohl Gesamt-Größe der jeweiligen Festplatte, als auch freien Speicherplatz auflistet. Hier der Code: $datum = get-date -format "yyyy-MM-dd" Get-WMIObject Win32_LogicalDisk -filter "DriveType=3" -computer (Get-Content c:\computers.txt) | Select SystemName,DeviceID,VolumeName,@{Name="Größe (GB)"; Expression={"{0:N1}" -f($_.size/1gb)}},@{Name="Freier Speicherplatz (GB)";Expression={"{0:N1}" -f($_.freespace/1gb)}} | out-file -filepath "c:\Festplattenplatz $datum.txt" Meine Ausgabedatei sieht folgendermaßen aus: SystemName : Server1 DeviceID : C: VolumeName : Größe (GB) : 67,7 Freier Speicherplatz (GB) : 21,9 SystemName : Server2 DeviceID : C: VolumeName : Größe (GB) : 67,7 Freier Speicherplatz (GB) : 15,8 SystemName : Server3 DeviceID : C: VolumeName : Größe (GB) : 19,9 Freier Speicherplatz (GB) : 2,1 In meinem Powershell-Skript ist ebenfalls eingebaut, dass nach erfolgreichem Auslesen der Server und Erstellen der Ausgabe-Datei eben erstellte Datei per Mail an mich gesendet wird. Nun möchte ich diese Mail aber nicht jeden Tag erhalten, sondern nur, wenn der freie Speicherplatz einer Platte unter 2 GB z.B. gesunken ist. Kann ich das irgendwie in meinem Powershell-Skript mit einbauen? Hier nochmal mein komplettes Skript, falls das hilft: $datum = get-date -format "yyyy-MM-dd" Get-WMIObject Win32_LogicalDisk -filter "DriveType=3" -computer (Get-Content c:\computers.txt) | Select SystemName,DeviceID,VolumeName,@{Name="Größe (GB)"; Expression={"{0:N1}" -f($_.size/1gb)}},@{Name="Freier Speicherplatz (GB)";Expression={"{0:N1}" -f($_.freespace/1gb)}} | out-file -filepath "c:\Festplattenplatz $datum.txt" function sendmail($body) { $filename = "c:\Festplattenplatz $datum.txt" $SmtpClient = new-object system.net.mail.smtpClient $MailMessage = New-Object system.net.mail.mailmessage $att = new-object Net.Mail.Attachment($filename) $SmtpClient.Host = "MAILSERVER" $mailmessage.from = "ABSENDER-MAIL-ADRESSE" $mailmessage.To.add("EMPFÄNGER-MAIL-ADRESSE") $mailmessage.Subject = “Festplattenplatz Server” $MailMessage.IsBodyHtml = $true $mailmessage.Body = $body $mailmessage.Attachments.Add($att) $smtpclient.Send($mailmessage) } $body = "siehe Anlage" sendmail $body Freue mich über Eure Hilfe. Vielen Dank! Bearbeitet 9. April 201312 j von Hornochse
9. April 201312 j Das habe ich schon versucht, bin aber kläglich gescheitert ;-) Ich kenne mich nicht ganz so gut in der Powershell aus. Hat gerade mal gereicht, um mir dieses Skriptchen zusammenzubasteln... ;-)
9. April 201312 j also wenn du das pro Server checken willst hast du zwei möglichkeiten: entweder gehst du mit einer foreachschleife über jeden einzelnen WMI Call, oder du parst das txt dokument ;-)
9. April 201312 j also wenn du das pro Server checken willst hast du zwei möglichkeiten: entweder gehst du mit einer foreachschleife über jeden einzelnen WMI Call, oder du parst das txt dokument ;-) das parsen des logfiles schon netzwerkressourcen und geht schneller.
9. April 201312 j nicht wenn er das interpretieren im eigentlichen wmi call miterledigt ;-) wenn man es noch fancy will, könnte man die wmi calls in die Task engine schieben und die server asynchron abarbeiten, da ist es dann noch schneller. ;-)
10. April 201312 j Also ich würde es mit der foreach-Schleife lösen und eine Fehlervariable lösen. Sieht dann in etwa so aus: $datum = get-date -format "yyyy-MM-dd" $fehler = $false; Get-Content c:\computers.txt | foreach-object { $abfrageergebnis = Get-WMIObject Win32_LogicalDisk -filter "DriveType=3" -computer $_ #Formatierung der Ergebnisse und Ausgabe in txt-Datei if ($abfrageergebnis.freespace -lt #Wert){ $fehler = $true; } } #Mailversand, wenn $fehler "$true" ist if($fehler){ send-mailmessage .... } P.s.: Das CMDLET "send-mailmessage" ist für den Mailversand etwas einfacher, als deine Lösung.
Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.