marcimarc85
Goto Top

Powershell Script soll Dauer jedes einzelnen Jobs ausgeben

Hi,

ich bin kurz vorm Verzweifeln. Ich habe nach einigem Rumprobieren ein PÜowershell_Script am Laufen, welches IP-Adressen aus eine Textdatei ausliest und auf den jeweilugen Systemen dann eine Software updated. Am Schluss lasse ich mir dann alles per Mail zusenden.

Jetzt stehe ich vor der Herausforderung, dass die Mail mir eine wunderschölne HTML Tabelle anzeigt, allerdings bei "Uhrzeit " nicht die Uhrzeit jedes einzelnen Jobs, wenn er fertiggestellt ist, sondern z.B. bei 10 Jobs, die parallell laufen wird mir für jeden Job die Uhrzeit des zuletzt fertiggestellten Jobs ausgegeben. Nie die individuelle Uhrzeit. Hier mal der entsprechende Codeblock des Scripts:

# Startzeit speichern
$startTime = Get-Date
    
$update_job = {

Param(
[string]$computer,
[string]$RootPath,
[string]$new_version,
[string]$ADMIN_PASSWORD
)


 $command = "$RootPath\PsExec.exe"  
 $scriptpath ="D:\software\enterprise\bin\powershell_tools\update_wizard_silent.ps1"  
 & $command "\\$computer" -accepteula -nobanner -u ".\administrator" -p $ADMIN_PASSWORD /s -i "powershell" $scriptpath $new_version 2>$null  
 $exitCode = $LASTEXITCODE
 Start-Sleep -Seconds (Get-Random -Minimum 5 -Maximum 15) # Simuliert eine zufällige Ausführungszeit
 # Überprüfe den Exit-Code und führe entsprechende Aktionen aus
switch ($exitCode) {
    0 {
        return "software Update $new_version erfolgreich ausgeführt (Exit-Code: 0)."  
        # Füge hier weitere Aktionen für Exit-Code 0 hinzu
    }
    1 {
        return "Ein Fehler ist aufgetreten (Exit-Code: 1)."  
        # Füge hier weitere Aktionen für Exit-Code 1 hinzu
    }
    default {
        return "Unbekannter Exit-Code: $exitCode."  
        # Füge hier weitere Aktionen für andere Exit-Codes hinzu
    }
}
 
}

# Erstellen einer Liste für die Jobs
$jobs = @()

# Starten der Jobs auf den externen Computern
Foreach ($computer in $computers) {
    $job = Start-Job -Name $computer -Scriptblock $update_job -ArgumentList $computer,$RootPath,$new_version,$ADMIN_PASSWORD 
    $jobs += $job
    #$body += "            - $computer`n"     
}

# Überwachen des Status der Jobs alle 5 Sekunden
while ($jobs.State -contains 'Running') {  
    Clear-Host
    Write-Host "Aktueller Status der Jobs $(Get-Date -Format 'HH:mm:ss'):"  

    foreach ($job in $jobs) {
        $status = $job.State
        if ($status -eq 'Running') {  
            Write-Host "$($job.Name): software Update $new_version läuft gerade. Bitte warten ..."  
        } elseif ($status -eq 'Completed') {  
            Write-Host "$($job.Name): software Update $new_version abgeschlossen."  
        } elseif ($status -eq 'Failed') {  
            Write-Host "$($job.Name): software Update $new_version fehlgeschlagen."  
        }
    }

    Start-Sleep -Seconds 5
}


$results = @()

foreach ($job in $jobs) {
    if ($job.State -eq 'Completed') {  
        # Ergebnis des Jobs abrufen
        $result = Receive-Job -Job $job

        # Füge das Ergebnis zur Ergebnismenge hinzu
        $results += [PSCustomObject]@{
            Server   = $job.Name
            Status    = 'Completed'  
            Ergebnis    = $result
            Uhrzeit      = $(Get-Date -Format 'HH:mm:ss')  
        }
    } elseif ($job.State -eq 'Failed') {  
        # Füge fehlgeschlagenen Job zur Ergebnismenge hinzu
        $results += [PSCustomObject]@{
            Server   = $job.Name
            Status    = 'Failed'  
            Ergebnis    = 'software Update $new_version ist fehlgeschlagen.'  
            Uhrzeit     = $(Get-Date -Format 'HH:mm:ss')  
        }
    } else {
        # Füge nicht abgeschlossenen Job zur Ergebnismenge hinzu
        $results += [PSCustomObject]@{
            Server   = $job.Name
            Status    = $job.State
            Ergebnis    = 'software Update $new_version ist noch nicht abgeschlossen.'  
            Uhrzeit     = $(Get-Date -Format 'HH:mm:ss')  
        }
    }
}



# Ergebnisse in einer Tabelle anzeigen
$results | Format-Table -AutoSize

# Konvertiere das Result-Feld in einen String
foreach ($result in $results) {
    $result.Ergebnis = $result.Ergebnis -join ", " # Verbindet die Array-Elemente mit einem Komma und Leerzeichen  
}

# CSS-Style für die Tabelle
$cssStyles = @"  
<style>
    table {
        border-collapse: collapse;
        width: auto;
    }
    th, td {
        border: 1px solid black;
        padding: 8px;
        text-align: left;
    }
    th {
        background-color: #3e9bd5;
        color: white;
    }
</style>
"@  



# Konvertiere die Ergebnisse in eine HTML-Tabelle mit CSS-Style
$htmlTable = $results | ConvertTo-Html -Head $cssStyles | Out-String


ich habe dann auch mal ChatGPT dazu befragt und ein einfaches Script ausgeben lassen, was genau das macht, was auch super funktioniert. Jetzt tue ich mich schwer beides miteinander zu kombinieren, denn ich möchte die "Live-Überwachung" aus meinem Scriptteil oben natürlich weiterhin verwenden können:

# Definiere eine Liste von Jobs
$jobs = @(
    @{ Name = "Job1"; ScriptBlock = { Start-Sleep -Seconds 5 } },  
    @{ Name = "Job2"; ScriptBlock = { Start-Sleep -Seconds 7 } },  
    @{ Name = "Job3"; ScriptBlock = { Start-Sleep -Seconds 9 } }  
)

# Array für die Ergebnisse
$results = @()

# Starte die Jobs
foreach ($job in $jobs) {
    $jobInstance = Start-Job -Name $job.Name -ScriptBlock $job.ScriptBlock
    $results += [PSCustomObject]@{
        JobName   = $job.Name
        Job       = $jobInstance
        StartTime = Get-Date
    }
}

# Warte auf alle Jobs und speichere die Endzeit
foreach ($result in $results) {
    Wait-Job -Job $result.Job
    $endTime = Get-Date

    # Füge das Ergebnis zur Tabelle hinzu
    $result | Add-Member -MemberType NoteProperty -Name EndTime -Value $endTime

    # Stoppe den Job und hole die Ausgabe (optional)
    Receive-Job -Job $result.Job | Out-Null
    Remove-Job -Job $result.Job
}

# Gebe die Ergebnisse in einer Tabelle aus
$results | Format-Table JobName, StartTime, EndTime -AutoSize


Hätte hier jemand eine Idee?

Content-ID: 670072

Url: https://administrator.de/forum/powershell-script-soll-dauer-jedes-einzelnen-jobs-ausgeben-670072.html

Ausgedruckt am: 15.01.2025 um 13:01 Uhr

151081
Lösung 151081 09.12.2024 aktualisiert um 15:00:01 Uhr
Goto Top
MarciMarc85
MarciMarc85 09.12.2024 um 15:33:42 Uhr
Goto Top
vielen Dank! Hat funktioniert.