If-Bedingung in Powershell funktioniert nicht wie erhofft
Hallo zusammen
Ich schreibe ein Script zum auslesen und vergleichen von Daten. Dabei geht es um Arbitszeiten. Das Script sieht so aus:
Die csv-Datei aus der ich die Daten importiere ist so aufgebaut:
x;x;x;x;Name;Vorname;Datum;Zeit;x;x;x;x;x
x;x;x;x;Walker;John;13.01.;08:00;x;x;x;x;x
x;x;x;x;Walker;John;13.01.;11:00;x;x;x;x;x
x;x;x;x;Walker;John;13.01.;12:00;x;x;x;x;x
x;x;x;x;Walker;John;13.01.;17:00;x;x;x;x;x
x;x;x;x;Walker;John;14.01.;07:00;x;x;x;x;x
x;x;x;x;Walker;John;14.01.;12:00;x;x;x;x;x
x;x;x;x;Walker;John;14.01.;12:30;x;x;x;x;x
x;x;x;x;Walker;John;14.01.;16:00;x;x;x;x;x
x;x;x;x;Walker;John;14.01.;17:00;x;x;x;x;x
x;x;x;x;Walker;John;14.01.;18:00;x;x;x;x;x
x;x;x;x;Zweifel;Hans;13.01.;07:00;x;x;x;x;x
x;x;x;x;Zweifel;Hans;13.01.;11:00;x;x;x;x;x
x;x;x;x;Zweifel;Hans;13.01.;12:00;x;x;x;x;x
x;x;x;x;Zweifel;Hans;13.01.;17:00;x;x;x;x;x
x;x;x;x;Zweifel;Hans;14.01.;07:00;x;x;x;x;x
x;x;x;x;Zweifel;Hans;14.01.;12:00;x;x;x;x;x
x;x;x;x;Zweifel;Hans;14.01.;12:30;x;x;x;x;x
x;x;x;x;Zweifel;Hans;14.01.;16:00;x;x;x;x;x
Die erste Zeitangabe ist wenn der Mitarbeiter zur Arbeit kommt, die zweite ist wenn er nach Hause oder Mittagessen geht.
Da ich immer die Totalarbeitszeit eines Tages berechnen möchte, aber nicht alle Leute gleich oft Stempeln, habe ich es mit den if und elseif Anweisungen versucht. Da ich mich nicht sehr gut mit PowerShell auskenne habe ich die if-Anweisungen mal so aufgebaut, wie es für mich nach ein wenig Recherche Sinn gemacht hat.
Das Problem ist allerdings, dass das Script immer nur die erste if-Anweisung benutzt, welche nur bei sechs gleichen Zeilen hintereinander verwendet werden sollte. Somit werden immer die Zeiten von sechs Zeilen nach $calc3 berechnet, auch wenn nur zwei Zeilen die selben Werte haben.
Ich nehme an das ganze liegt an den Bedingungen welche ich für die if-Schleife benutze. Kann mir ja jemand weiterhelfen?
Falls ihr Fragen habt oder zusätzliche Infos braucht, meldet euch gerne. Vielen Dank schonmal im Voraus.
Ich schreibe ein Script zum auslesen und vergleichen von Daten. Dabei geht es um Arbitszeiten. Das Script sieht so aus:
clear
$table = Import-Csv -Path 'C:\Temp\Stempelungen\StempelungenJira.csv' -Delimiter ";"
$counter = 0
$tablelength = $table.count
while ($counter -lt $tablelength) {
$parts = $table[$counter] -split ';'
$name = $parts[4]
$prename = $parts[5]
$date = $parts[6]
$time = $parts[7]
$parts2 = $table[$counter + 1] -split ';'
$name2 = $parts2[4]
$prename2 = $parts2[5]
$date2 = $parts2[6]
$time2 = $parts2[7]
$parts3 = $table[$counter + 2] -split ';'
$name3 = $parts3[4]
$prename3 = $parts3[5]
$date3 = $parts3[6]
$time3 = $parts3[7]
$parts4 = $table[$counter + 3] -split ';'
$name4 = $parts4[4]
$prename4 = $parts4[5]
$date4 = $parts4[6]
$time4 = $parts4[7]
$parts5 = $table[$counter + 4] -split ';'
$name5 = $parts5[4]
$prename5 = $parts5[5]
$date5 = $parts5[6]
$time5 = $parts5[7]
$parts6 = $table[$counter + 5] -split ';'
$name6 = $parts6[4]
$prename6 = $parts6[5]
$date6 = $parts6[6]
$time6 = $parts6[7]
$name=$name -replace 'Name='
$name2=$name2 -replace 'Name='
$name3=$name3 -replace 'Name='
$name4=$name4 -replace 'Name='
$name5=$name5 -replace 'Name='
$name6=$name6 -replace 'Name='
$prename=$prename -replace 'Vorname='
$prename2=$prename2 -replace 'Vorname='
$prename3=$prename3 -replace 'Vorname='
$prename4=$prename4 -replace 'Vorname='
$prename5=$prename5 -replace 'Vorname='
$prename6=$prename6 -replace 'Vorname='
$date=$date -replace 'Stempeldatum='
$date2=$date2 -replace 'Stempeldatum='
$date3=$date3 -replace 'Stempeldatum='
$date4=$date4 -replace 'Stempeldatum='
$date5=$date5 -replace 'Stempeldatum='
$date6=$date6 -replace 'Stempeldatum='
$time=$time -replace 'Zeit='
$time2=$time2 -replace 'Zeit='
$time3=$time3 -replace 'Zeit='
$time4=$time4 -replace 'Zeit='
$time5=$time5 -replace 'Zeit='
$time6=$time6 -replace 'Zeit='
$calc = (get-date $time2) - (get-date $time)
$calc2 = ((get-date $time2) - (get-date $time)) + ((get-date $time4) - (get-date $time3))
$calc3 = ((get-date $time2) - (get-date $time)) + ((get-date $time4) - (get-date $time3)) + ((get-date $time6) - (get-date $time5))
if ($name -eq $name2 -eq $name3 -eq $name4 -eq $name5 -eq $name6 -and $date -eq $date2 -eq $date3 -eq $date4 -eq $date5 -eq $date6 -and $prename -eq $prename2 -eq $prename3 -eq $prename4 -eq $prename5 -eq $prename6) {
write-host "Name = $name";"Vorname = $prename";"Stempeldatum = $date";"Zeit = $calc3"
$counter = $counter + 6
}
elseif ($name -eq $name2 -eq $name3 -eq $name4 -and $date -eq $date2 -eq $date3 -eq $date4 -and $prename -eq $prename2 -eq $prename3 -eq $prename4 ) {
write-host "Name = $name";"Vorname = $prename";"Stempeldatum = $date";"Zeit = $calc2"
$counter = $counter + 4
}
elseif ($name -eq $name2 -and $prename -eq $prename2 -and $date -eq $date2) {
write-host "Name = $name";"Vorname = $prename";"Stempeldatum = $date";"Zeit = $calc"
$counter = $counter + 2
}
else{
$counter = $counter + 1
}
}
Die csv-Datei aus der ich die Daten importiere ist so aufgebaut:
x;x;x;x;Name;Vorname;Datum;Zeit;x;x;x;x;x
x;x;x;x;Walker;John;13.01.;08:00;x;x;x;x;x
x;x;x;x;Walker;John;13.01.;11:00;x;x;x;x;x
x;x;x;x;Walker;John;13.01.;12:00;x;x;x;x;x
x;x;x;x;Walker;John;13.01.;17:00;x;x;x;x;x
x;x;x;x;Walker;John;14.01.;07:00;x;x;x;x;x
x;x;x;x;Walker;John;14.01.;12:00;x;x;x;x;x
x;x;x;x;Walker;John;14.01.;12:30;x;x;x;x;x
x;x;x;x;Walker;John;14.01.;16:00;x;x;x;x;x
x;x;x;x;Walker;John;14.01.;17:00;x;x;x;x;x
x;x;x;x;Walker;John;14.01.;18:00;x;x;x;x;x
x;x;x;x;Zweifel;Hans;13.01.;07:00;x;x;x;x;x
x;x;x;x;Zweifel;Hans;13.01.;11:00;x;x;x;x;x
x;x;x;x;Zweifel;Hans;13.01.;12:00;x;x;x;x;x
x;x;x;x;Zweifel;Hans;13.01.;17:00;x;x;x;x;x
x;x;x;x;Zweifel;Hans;14.01.;07:00;x;x;x;x;x
x;x;x;x;Zweifel;Hans;14.01.;12:00;x;x;x;x;x
x;x;x;x;Zweifel;Hans;14.01.;12:30;x;x;x;x;x
x;x;x;x;Zweifel;Hans;14.01.;16:00;x;x;x;x;x
Die erste Zeitangabe ist wenn der Mitarbeiter zur Arbeit kommt, die zweite ist wenn er nach Hause oder Mittagessen geht.
Da ich immer die Totalarbeitszeit eines Tages berechnen möchte, aber nicht alle Leute gleich oft Stempeln, habe ich es mit den if und elseif Anweisungen versucht. Da ich mich nicht sehr gut mit PowerShell auskenne habe ich die if-Anweisungen mal so aufgebaut, wie es für mich nach ein wenig Recherche Sinn gemacht hat.
Das Problem ist allerdings, dass das Script immer nur die erste if-Anweisung benutzt, welche nur bei sechs gleichen Zeilen hintereinander verwendet werden sollte. Somit werden immer die Zeiten von sechs Zeilen nach $calc3 berechnet, auch wenn nur zwei Zeilen die selben Werte haben.
Ich nehme an das ganze liegt an den Bedingungen welche ich für die if-Schleife benutze. Kann mir ja jemand weiterhelfen?
Falls ihr Fragen habt oder zusätzliche Infos braucht, meldet euch gerne. Vielen Dank schonmal im Voraus.
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 652525
Url: https://administrator.de/forum/if-bedingung-in-powershell-funktioniert-nicht-wie-erhofft-652525.html
Ausgedruckt am: 22.04.2025 um 18:04 Uhr
3 Kommentare
Neuester Kommentar

Hi,
Für solche Sachen gibt es Group-Object:
Ergebnis als CSV ausgegeben
Gruß SchmitzKatz
Für solche Sachen gibt es Group-Object:
$csv = @'
H1;H2;H3;H4;Name;Vorname;Datum;Zeit;H9;H10;H11;H12;H13
x;x;x;x;Walker;John;13.01.;08:00;x;x;x;x;x
x;x;x;x;Walker;John;13.01.;11:00;x;x;x;x;x
x;x;x;x;Walker;John;13.01.;12:00;x;x;x;x;x
x;x;x;x;Walker;John;13.01.;17:00;x;x;x;x;x
x;x;x;x;Walker;John;14.01.;07:00;x;x;x;x;x
x;x;x;x;Walker;John;14.01.;12:00;x;x;x;x;x
x;x;x;x;Walker;John;14.01.;12:30;x;x;x;x;x
x;x;x;x;Walker;John;14.01.;16:00;x;x;x;x;x
x;x;x;x;Walker;John;14.01.;17:00;x;x;x;x;x
x;x;x;x;Walker;John;14.01.;18:00;x;x;x;x;x
x;x;x;x;Zweifel;Hans;13.01.;07:00;x;x;x;x;x
x;x;x;x;Zweifel;Hans;13.01.;11:00;x;x;x;x;x
x;x;x;x;Zweifel;Hans;13.01.;12:00;x;x;x;x;x
x;x;x;x;Zweifel;Hans;13.01.;17:00;x;x;x;x;x
x;x;x;x;Zweifel;Hans;14.01.;07:00;x;x;x;x;x
x;x;x;x;Zweifel;Hans;14.01.;12:00;x;x;x;x;x
x;x;x;x;Zweifel;Hans;14.01.;12:30;x;x;x;x;x
x;x;x;x;Zweifel;Hans;14.01.;16:00;x;x;x;x;x
'@ | ConvertFrom-Csv -Delimiter ";"
$csv | group Name,Vorname,Datum | %{
$time = $null
for ($i = 0; $i -lt $_.Group.Count; $i+=2){
$time += ([timespan]$_.Group[($i+1)].Zeit - [timespan]$_.Group[$i].Zeit)
}
$_.Group | select -First 1 Name,Vorname,Datum,@{n='Arbeitszeit';e={$time}}
} | Export-CSV ".\data_export.csv" -delimiter ";" -NoType -Encoding UTF8
Ergebnis als CSV ausgegeben
"Name";"Vorname";"Datum";"Work-Hours"
"Walker";"John";"13.01.";"08:00:00"
"Walker";"John";"14.01.";"09:30:00"
"Zweifel";"Hans";"13.01.";"09:00:00"
"Zweifel";"Hans";"14.01.";"08:30:00"