2017-01-30 3 views
1

Ich habe eine CSV-Eingabedatei wie:Letzte Wiederholung in csv

Datum, die Zeit, PC, Zustand

25.01.2017, 10: 30: 57; pc1; inaktiv

25.01 0,2017; 10: 35: 57; pc2; aktive

25.01.2017, 10: 37: 34; pc1; aktive

25.01.2017, 10: 38: 35; PC3; inaktiv

2017.01.25; 10: 39: 20; pc1; inaktiv

25.01.2017, 10: 42: 10; pc2; inaktiv

25.01.2017, 10: 42: 10; PC3; aktive

Also, ich muss nur letzte PC-Wiederholung mit inaktiven Zustand zeigen und den Unterschied zwischen Zeit und aktueller Zeit zeigen. So Ergebnis muss sein:

pc1 inaktiv von 10:39:20

pc2 inaktiv von 10:42:10

nicht wissen, wie es in Powershell zu realisieren. Brauchen Sie Hilfe :)

Antwort

1

Hier, im Moment nur sie gibt es über Write-Host, aber Sie sollten es wieder aufbauen können, mit den Daten zu tun, was Sie wollen:

$csv = import-csv .\test.csv -Delimiter ";" 
$pcs = $csv.pc | select -Unique 
foreach($pc in $pcs) { 

#get all entries for current pc and order by date/time, then select newest entry 
$le = $csv | where {$_.pc -eq $pc} | sort date,time -Descending | select -First 1 

#if last state is inactive 
if($le.state -eq "inactive"){ 
    $writedate = get-date -Date $le.date -Hour $le.time.Substring(0,2) -Minute $le.time.Substring(3,2) -Second $le.time.Substring(6,2) 
    $td = (get-date) - $writedate 
    write-host "time difference for $pc : $($td.Days) days $($td.Hours) hours, $($td.Minutes) minutes, $($td.Seconds) seconds" 
} 

} 

Wenn Ihr Zeitfeld nicht immer in HH: MM: DD Sie das Skript ändern müssen empfangen, dass

+0

Dank, es funktioniert. Aber ich möchte zum Beispiel pc3 nicht zeigen, weil es aktiv ist. Ich muss nur inaktive Computer anzeigen. Irgendwelche Ideen? – Damir

+0

$ Paul, können Sie zeigen, wie bitte?) – Damir

+0

Entschuldigung :) Warten auf Ihre Bearbeitung :) und was ist mit Filter wie wenn Computer mehr als 2 Tage inaktiv - don 't zeigen es auch? – Damir

0

Zwei Lösungen, ein kurzes die Frage wörtliche unter:

$csv = import-csv .\SO_41941150.csv -Delimiter ";" 
$csv|group pc|%{$_.group|select -last 1|? state -eq 'inactive'|%{"$($_.pc) inactive from $($_.time)"}} 

W it der genaue Ausgang:

pc1 inactive from 10:39:20 
pc2 inactive from 10:42:10 

Eine längere Umwandlung ein Datum und die Uhrzeit mit in Datetime :: ParseExact und Gesamt/Minuten als Ergebnis verstrichen zu geben.

$csv = import-csv .\SO_41941150.csv -Delimiter ";" 
$csv | Group-Object pc | Foreach-Object { 
    $_.Group | Select-Object -last 1 | Where-Object state -eq 'inactive'| 
    ForEach-Object { 
    $DT = [datetime]::ParseExact("$($_.date) $($_.time)","dd.MM.yyyy HH:mm:ss",$null) 
    $Secs = [int]((get-date) - $DT).TotalSeconds 
    $mins = [int]((get-date) - $DT).TotalMinutes 
    "$($_.pc) inactive since $Mins minutes or $Secs seconds" 
    } 
} 

Ausgang:

pc1 inactive since 9160 minutes or 549578 seconds 
pc2 inactive since 9157 minutes or 549408 seconds 
+0

danke! funktioniert auch super! :) – Damir

Verwandte Themen