Batch vergleich von zwei dateien
Hallo,
nach Jahrelangem zugucken, habe ich jetzt schlussendlich eine Frage welche ich selbst stelle.
Ich versuche 2 zeiten aus 2 dateien miteinander zu vergleichen und wenn die "alte" zeit geringer ist als die "neue", soll die alte ersetzt werden.
Leider stehe ich jetzt ein bisschen im Wald, wenn man Stundenlang nach einer Lösung sucht, sieht man evtl. die einfacheren Möglichkeiten nicht. Daher wäre super wenn mir jemand dabei helfen könnte. Was ich bisher habe:
Der erste abschnitt bereitet die Zeiten nur wie folgt auf:
2 16 543 zu 2:16:543
Das ganze soll in einer for schleife, denn es sollen einige hundert Dateipaare verglichen werden.
folgender Output wird generiert:
Wie es aussieht komme ich mit den set raw nicht zurecht, dort wird es nicht mitgenommen.
Danke euch,
BTW schöne community hier!
Gruß Dave
nach Jahrelangem zugucken, habe ich jetzt schlussendlich eine Frage welche ich selbst stelle.
Ich versuche 2 zeiten aus 2 dateien miteinander zu vergleichen und wenn die "alte" zeit geringer ist als die "neue", soll die alte ersetzt werden.
Leider stehe ich jetzt ein bisschen im Wald, wenn man Stundenlang nach einer Lösung sucht, sieht man evtl. die einfacheren Möglichkeiten nicht. Daher wäre super wenn mir jemand dabei helfen könnte. Was ich bisher habe:
for /f %%A in ('dir /s /b timings\*.new') do (
for /f "tokens=1,2,3 delims= " %%r in (%%A) do (
echo %%r:%%s:%%t > %%A
)
for /f %%r in (%%A) do (
set inp=%%A
set raw=%inp:~0,-3%
set tnew=%%r
if exist %raw%txt (
set told= <%raw%txt
)
if not exist %raw%txt (
set told=99.99.999
)
if "%tnew%" LSS "%told%" echo %tnew% > %raw%txt
)
)
Der erste abschnitt bereitet die Zeiten nur wie folgt auf:
2 16 543 zu 2:16:543
Das ganze soll in einer for schleife, denn es sollen einige hundert Dateipaare verglichen werden.
folgender Output wird generiert:
set inp=C:\test\logtest\timings\nurburgring\ruf_yellowbird\RealDaveGER.new
set raw=C:\test\logtest\timings\nurburgring\ruf_yellowbird\RealDaveGER.
set tnew=2:19:654
if exist C:\test\logtest\timings\nurburgring\abarth500_s1\alexis.thomas69.txt (
set told= 0<C:\test\logtest\timings\nurburgring\abarth500_s1\alexis.thomas69.txt )
if not exist C:\test\logtest\timings\nurburgring\abarth500_s1\alexis.thomas69.txt (set told=99.99.999 )
if "2:19:654" LSS "99.99.999" echo 2:19:654 1>C:\test\logtest\timings\nurburgring\abarth500_s1\alexis.thomas69.txt
)
2:19:654
Wie es aussieht komme ich mit den set raw nicht zurecht, dort wird es nicht mitgenommen.
Danke euch,
BTW schöne community hier!
Gruß Dave
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 261023
Url: https://administrator.de/forum/batch-vergleich-von-zwei-dateien-261023.html
Ausgedruckt am: 22.04.2025 um 07:04 Uhr
6 Kommentare
Neuester Kommentar
Hallo Dave, willkommen im Forum.
Ich denke du hast 2 Probleme.
Um dir helfen zu können, wäre es besser du würdest mal beispielhaft den Inhalt einer deiner *.new Dateien posten.
Grüße
rubberman
Ich denke du hast 2 Probleme.
- Variablen werden innerhalb einer Kommandozeile oder eines (in Klammern eingefassten) Blocks von Kommandozeilen nur einmal zum Wert aufgelöst. Abhilfe schafft die verzögerte Variablenerweiterung (
setlocal EnableDelayedExpansion
). - Da du Punkte zwischen deinen Zahlen setzt, wird alphanumerisch verglichen. Ohne vorangestellte 0 bei einstelligen Stunden, ist das Ergebnis nicht das, das du erwartest. (2.12.123 ist größer als 10.12.123, da 2 größer als 1 ist)
Um dir helfen zu können, wäre es besser du würdest mal beispielhaft den Inhalt einer deiner *.new Dateien posten.
Grüße
rubberman
Hallo Dave.
Egal. Beantworte erst mal die erste Frage. Wahrscheinlich kann man sich die verzögerte Erweiterung sowieso sparen.
Grüße
rubberman
2 15 547
Ah, OK. Wenn das Beispiel 15 mal einstellig ist, hast du dann eine vorangestellte 0? Also bspw. 9 oder 09?dann wird meines erachtens richtig verglichen.
Oh, das ist ja noch schlimmer (hatte ich gar nicht gesehen). Punkt und Doppelpunk sind nicht die gleichen Zeichen in einem Vergleich.Leider bringt "EnableDelayedExpansion" keine Veränderung.
Doch, doch. Die Syntax für Variablen ändert sich aber gleichzeitig. Aus den umschließenden Prozentzeichen müssen umschließende Ausrufezeichen werden.Egal. Beantworte erst mal die erste Frage. Wahrscheinlich kann man sich die verzögerte Erweiterung sowieso sparen.
Grüße
rubberman
OK, hab mal fix was zusammen geschrieben, was unabhängig davon immer funktionieren sollte.
Grüße
rubberman
@echo off &setlocal
set /a "current_num = 0, smallest_num = 9999999"
set "file="
for /f "delims=" %%i in ('dir /a-d /b /s "timings\*.new"') do (
for /f "usebackq tokens=1-3" %%j in ("%%~i") do (
set /a "current_num = 100000 * (100%%j %% 100) + 1000 * (100%%k %% 100) + 1000%%l %% 1000"
setlocal EnableDelayedExpansion
echo !current_num! kleiner als !smallest_num! ?
if !current_num! lss !smallest_num! (
endlocal
set /a "smallest_num = current_num"
set "file=%%~i"
) else endlocal
)
)
echo Datei mit der kleinsten Nummernfolge:
echo "%file%"
pause
Grüße
rubberman