bonaskorn
Goto Top

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:

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.

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

BonasKorn
BonasKorn 16.02.2021 um 10:53:58 Uhr
Goto Top
Ich habe es nun folgendermassen gelöst:

    if ($name -eq $name3 -and $name3 -eq $name5 -and $date -eq $date3 -and $date3 -eq $date5 -and $prename -eq $prename3 -and $prename3 -eq $prename5) {

        write-host "Name = $name";"Vorname = $prename";"Stempeldatum = $date";"Zeit = $calc3"  

        $counter = $counter + 6

    }

    elseif ($name -eq $name3 -and $date -eq $date3 -and $prename -eq $prename3) {

        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

    }

So funktioniert es bei mir.
Doskias
Doskias 16.02.2021 um 11:04:10 Uhr
Goto Top
Moin,

Ich persönlich würde die Auswertung als Schleife für jeden MA einzeln durchgehen. Das gibt dir nämlich die Option, dass du dann mit dem Abfragen einer Variablen gezielt nur einen MA auswerten kannst. So musst du ja immer alle auswerten.

Gruß
Doskias
147669
147669 16.02.2021 aktualisiert um 11:49:08 Uhr
Goto Top
Hi,
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"
Gruß SchmitzKatz