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:
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:
Hätte hier jemand eine Idee?
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?
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
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
2 Kommentare
Neuester Kommentar
Stichwort 😋
$job.PSBeginTime
$job.PSEndTime