enum State { Started Finished Failed } function GetVMName { param ( [string]$Rest ) $tokens = $Rest -split "'" return $tokens[1] } function ConvertDate { param ( [string]$DateString ) return [DateTime]$DateString } function DeterminState { param ( [String]$Rest ) if($Rest.IndexOf("Erfolgreiche") -cge 0){ return 'Finished' } elseif ($Rest.IndexOf("gestartet") -cge 0) { return 'Started' } else { return 'Failed' } } function ProduceHashMap { param ( $Elements ) $HashTable =@{} foreach ($elem in $Elements){ $indexOfFirst = $elem.IndexOf(" ") if($indexOfFirst -le 0){ continue } $date = $elem.SubString(0,$elem.IndexOf(" ",($indexOfFirst + 1))) $rest = $elem.Substring($elem.IndexOf(" ",($indexOfFirst + 1))+1) $vmName = GetVMName($rest) $backUpState = DeterminState($rest) $timeStamp if($HashTable.ContainsKey($vmName)){ $array = $HashTable[$vmName] $lastState=($array[$array.Count-1]).state #Write-Host $lastState #Write-Host $backUpState if (($lastState -eq 'Failed') -and ($backUpState -eq 'Failed')) { #Write-Host "skipping" continue } #Write-Host "continuing" try { $timeStamp = ConvertDate($date) $array += New-Object psobject -Property @{ state = $backUpState ts = $timeStamp } } catch { foreach ($i in (($array.Count-1)..0)){ #Write-Host $array[$i] if ($array[$i]["state"] -eq 'Started') { #Write-Host "found started" $timeStamp = ($array[$i]).ts } } $array += New-Object psobject -Property @{ state = $backUpState ts = $timeStamp } } $HashTable[$vmName]=$array } else { try { $timeStamp = ConvertDate($date) $HashTable += @{$vmName=@(New-Object psobject -Property @{ state = $backUpState ts = $timeStamp })} } catch { <#Do nothing as key is empty and failed state#> } } } return $HashTable } function getElems { param ( $Path ) $lines = Get-Content -Path $Path | ForEach-Object {$_.SubString($_.IndexOf(":")+1)} $elems = $lines | Out-String -Stream | Select-String -Pattern "VMware-Maschine" | Out-String -Stream return $elems } function ProcessLogToHash { param ( $Path ) ProduceHashMap -Elements $(getElems -Path $Path) }