PowerShell ForEach Anzahl und Ergebnis-Ausgabe
Guten Tag,
ich habe eine kleine Frage, die vermutlich recht simpel zu beantworten ist.
Ich habe folgenden PowerShell-Befehl gefunden:
Ich verstehe, was dieser Codeblock macht; er startet das WSUS Admin-Modul, holt sich den WSUS-Namen, holt sich Updates, die den Status "abgelehnt" haben und speichert die in der $declined Variable und löscht mit dem ForEach loop alle Updates aus der Datenbank - und konvertiert das Update in einen String und gibt den Titel des Updates in der Console aus und fügt "removed" hinzu. Soweit so gut, dass Script funktioniert auch super.
Ich hätte da aber gerne eine kleine Änderung und da hört mein Wissen mit PowerShell dann leider auf.
Ich will, dass die Anzahl der "removed" Updates gezählt wird und am Ende des Scriptes ausgegeben wird und eine kleine Summary.txt geschrieben wird. Damit man am Ende sehen kann, wieviele Updates gelöscht wurden und eine kleine "Beweis"-Datei für die Doku o.ä. erhält.
Ich vermute, dass man da nur den foreach-Loop anpassen muss? Und dann das Ergebnis mit Write-Host ausgegeben wird und gleichzeitig das Ergebnis in eine .txt gepiped werden muss?
Kann mir da jemand helfen?
Vielen Dank im Voraus
MfG
ich habe eine kleine Frage, die vermutlich recht simpel zu beantworten ist.
Ich habe folgenden PowerShell-Befehl gefunden:
# Quelle: https://serverfault.com/questions/1013716/wsus-is-downloading-hundreds-of-old-declined-updates
[reflection.assembly]::LoadWithPartialName("Microsoft.UpdateServices.Administration")
$wsus = [Microsoft.UpdateServices.Administration.AdminProxy]::GetUpdateServer();
$declined=$wsus.GetUpdates() | Where {$_.IsDeclined -eq $true}
$declined| ForEach-Object {$wsus.DeleteUpdate($_.Id.UpdateId.ToString()); Write-Host $_.Title removed }
Ich verstehe, was dieser Codeblock macht; er startet das WSUS Admin-Modul, holt sich den WSUS-Namen, holt sich Updates, die den Status "abgelehnt" haben und speichert die in der $declined Variable und löscht mit dem ForEach loop alle Updates aus der Datenbank - und konvertiert das Update in einen String und gibt den Titel des Updates in der Console aus und fügt "removed" hinzu. Soweit so gut, dass Script funktioniert auch super.
Ich hätte da aber gerne eine kleine Änderung und da hört mein Wissen mit PowerShell dann leider auf.
Ich will, dass die Anzahl der "removed" Updates gezählt wird und am Ende des Scriptes ausgegeben wird und eine kleine Summary.txt geschrieben wird. Damit man am Ende sehen kann, wieviele Updates gelöscht wurden und eine kleine "Beweis"-Datei für die Doku o.ä. erhält.
Ich vermute, dass man da nur den foreach-Loop anpassen muss? Und dann das Ergebnis mit Write-Host ausgegeben wird und gleichzeitig das Ergebnis in eine .txt gepiped werden muss?
Kann mir da jemand helfen?
Vielen Dank im Voraus
MfG
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 1192822860
Url: https://administrator.de/contentid/1192822860
Ausgedruckt am: 21.11.2024 um 21:11 Uhr
3 Kommentare
Neuester Kommentar
Du könntest dir direkt mit
die Anzahl direkt anzeigen lassen, darüber ob sie erfolgreich entfernt wurden sagt das natürlich nichts aus, das könntest du bswp. so machen
$declined.Count
$logfile = ".\log_$(get-date -F yyyyMMddHHmm).csv"
[reflection.assembly]::LoadWithPartialName("Microsoft.UpdateServices.Administration")
$wsus = [Microsoft.UpdateServices.Administration.AdminProxy]::GetUpdateServer();
$declined = $wsus.GetUpdates() | Where {$_.IsDeclined -eq $true}
$result = $declined | ForEach-Object {
try{
$wsus.DeleteUpdate($_.Id.UpdateId.ToString())
[pscustomobject]@{Time=get-date;Update=$_.Title; Removed = "OK"}
}catch{
[pscustomobject]@{Time=get-date;Update=$_.Title; Removed = "ERROR: $($_.Exception.Message)"}
}
}
if ($declined.Count -gt 0){
$result | export-csv $logfile -Delimiter ";" -NoTypeInformation -Encoding UTF8
write-host "Logfile written to '$logfile.'" -F Green
write-host "Successfully removed updates: $(($result | ? Removed -eq 'OK').Count)" -F Green
write-host "Failed removing updates: $(($result | ? Removed -ne 'OK').Count)" -F Green
}else{
write-host "No updates pending for cleanup." -F Yellow
}
Zitat von @support-it:
Hallo evoplus,
vielen Dank für deine Antwort.
Ich habe das Script bei einem neuen WSUS ausgeführt, wo es nur 1 abgelehntes Update gab. Die Ausgabe in eine Log-Datei funktioniert super, danke!
Was leider noch nicht ganz so gut funktioniert ist die Ausgabe des Ergebnises in der Shell. Im Log stand sauber drin, dass das Update abgelehnt wurde, das PowerShell-Fenster hat sich leider direkt geschlossen, ich habe nur noch was grünes aufblitzen gesehen.
War von mir so vorgesehen Ausgaben zu einzelnen Updates hatte ich weggelassen. Kannst du natürlich jederzeit so anpassen wie du es brauchst.Hallo evoplus,
vielen Dank für deine Antwort.
Ich habe das Script bei einem neuen WSUS ausgeführt, wo es nur 1 abgelehntes Update gab. Die Ausgabe in eine Log-Datei funktioniert super, danke!
Was leider noch nicht ganz so gut funktioniert ist die Ausgabe des Ergebnises in der Shell. Im Log stand sauber drin, dass das Update abgelehnt wurde, das PowerShell-Fenster hat sich leider direkt geschlossen, ich habe nur noch was grünes aufblitzen gesehen.
Ich glaube, ich habe das Problem insofern gelöst, dass ich am Ende der jeweiligen if-Abfrage ein "pause" oder "timeout *" setze, sodass es für Menschen lesbar ist :D Also egal, ob es keine Updates gibt oder das x-Updates entfernt wurden, wartet das Script auf eine Eingabe.
Jepp kannst du natürlich machen. Ging davon aus das das Script in ner sowieso offen Konsole gestartet wird.Natürlich mit der Einschränkung, dass wenn ich ein "pause" setze, das Script nicht direkt automatisiert werden kann.
Joa.Danke!
Bidde.