SCCM: PowerShell-Skript, um OSD-Ergebnisse zu parsen

Wenn man im SCCM 2012 (R2) eine TaskSequenz laufen lässt, bricht diese normalerweise ab, sobald ein einzelner Step fehlerhaft ist. Um aber gerade bei längeren Tasksequenzen einen Abbruch (evtl. kurz vor Fertigstellung) zu vermeiden, kann man einzelne (oder auch alle) Schritte so konfigurieren, dass bei deren Fehler dennoch regulär weitergearbeitet wird:

TaskSequenz_BeiFehler

Wenn man nun diese Option wählt, kann es einem leicht passieren, dass man bei Fertigstellung einer Tasksequenz nicht sofort sieht, ob alle Schritte erfolgreich abgearbeitet wurden oder eben einzelne Schritte einen Fehler verursacht haben. Um diese leichter abprüfen zu können, habe ich ein kleines PowerShell-Skript geschrieben. Dieses erhebt nicht den Anspruch, aus Programmierer-Sicht optimal geschrieben zu sein, sondern es soll in erster Linie funktionieren. Und das tut es (zumindest in unserer Produktiv-Umgebung) sehr gut ;-)

Hier nun das Skript-Listing (und hier als .ps1 zum Download):

cls            
$failed = New-Object System.Collections.ArrayList            
$success = New-Object System.Collections.ArrayList            
$logfiles = New-Object System.Collections.ArrayList            
$logdirs = New-Object System.Collections.ArrayList            
$notfound = 0            
$tsfailed = $false            
            
$logdirs += 'C:\Windows\ccm\logs'            
$logdirs += 'C:\Windows\ccm\logs\smstslog'            
$logdirs += 'c:\_SMSTaskSequence\Logs\Smstslog\'            
$logdirs += 'c:\windows\system32\ccm\logs\Smstslog\'            
$logdirs += 'c:\windows\system32\ccm\logs\'            
$logdirs += 'c:\windows\sysWOW64\ccm\logs\'            
            
            
foreach($logdir in $logdirs)            
{            
    If (Test-Path $logdir)            
    {            
        $foundlogfiles = Get-ChildItem $logdir -Filter smsts*.log            
        foreach($foundlogfile in $foundlogfiles)            
        {            
            $logfiles += $foundlogfile.FullName            
        }            
    }            
}            
            
foreach ($file in $logfiles)            
{            
    Write-Host 'Parsing Logile' $file            
    $logzeilen = Select-String -Path $file -Pattern 'Failed to run the action:'            
    foreach ($zeile in $logzeilen)            
    {            
        $zeile = $zeile.ToString()            
        $pos1 = $zeile.IndexOf('Failed to run the action:')            
        $pos2 = $zeile.IndexOf(')]LOG]!>')            
        if ($pos2 -le $pos1)            
        {            
            $pos2 = $zeile.Length            
        }            
        $Paket = $zeile.Substring($pos1+26,$pos2-($pos1+26))            
        $failed += $Paket            
        $notfound++            
    }            
}            
            
foreach ($file in $logfiles)            
{            
    $logzeilen = Select-String -Path $file -Pattern 'Successfully completed the action'            
    foreach ($zeile in $logzeilen)            
    {            
        $zeile = $zeile.ToString()            
        $pos1 = $zeile.IndexOf('Successfully completed the action (')            
        $pos2 = $zeile.IndexOf(') with the exit')            
        $Paket = $zeile.Substring($pos1+35,$pos2-($pos1+35))            
        $success += $Paket            
    }            
}            
            
foreach ($file in $logfiles)            
{            
    $logzeilen = Select-String -Path $file -Pattern 'Execution of task sequence failed'            
    if ($logzeilen.Count -gt 0)            
    {            
        $tsfailed = $true            
    }            
}            
            
if ($tsfailed)            
{            
    Write-Host -Foregroundcolor Red 'The whole TaskSequence failed to run!'            
}            
            
if ($notfound -gt 0)            
{            
    Write-Host -ForegroundColor Yellow 'At least one action failed. TaskSequence possibly aborted!'            
    Write-Host -ForegroundColor Red 'Failed actions:'            
    foreach($pak in $failed)            
    {            
        Write-Host $pak            
    }            
}            
            
Write-Host -ForegroundColor Green 'Successfully completed actions:'            
foreach($pak in $success)            
{            
    Write-Host $pak            
}            
            
if ($notfound -gt 0)            
{            
    Write-Host -ForegroundColor Yellow 'At least one action failed. TaskSequence possibly aborted!'            
}            
            
Read-Host "Done - press any key to continue ..."

 

Ausgabe sieht dann in etwa so aus:

Output

Kommentare sind geschlossen