support-m
Goto Top

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:

# 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 face-smile

MfG

Content-ID: 1192822860

Url: https://administrator.de/contentid/1192822860

Ausgedruckt am: 21.11.2024 um 21:11 Uhr

149062
Lösung 149062 25.08.2021 aktualisiert um 11:29:32 Uhr
Goto Top
Du könntest dir direkt mit
$declined.Count 
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
$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  
}
support-m
support-m 25.08.2021 um 15:19:47 Uhr
Goto Top
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.
Natürlich mit der Einschränkung, dass wenn ich ein "pause" setze, das Script nicht direkt automatisiert werden kann.

Danke!
149062
149062 25.08.2021 aktualisiert um 15:26:42 Uhr
Goto Top
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.
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.