Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

Batch vergleich von zwei dateien

Frage Entwicklung Batch & Shell

Mitglied: realdaveger

realdaveger (Level 1) - Jetzt verbinden

24.01.2015, aktualisiert 26.01.2015, 767 Aufrufe, 6 Kommentare

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:

01.
for /f %%A in ('dir /s /b timings\*.new') do (  
02.
	for /f "tokens=1,2,3 delims= " %%r in (%%A) do ( 
03.
		echo %%r:%%s:%%t > %%A 
04.
05.
	for /f %%r in (%%A) do ( 
06.
		set inp=%%A 
07.
		set raw=%inp:~0,-3% 
08.
		set tnew=%%r 
09.
		if exist %raw%txt (  
10.
			set told= <%raw%txt 
11.
			)  
12.
		if not exist %raw%txt (  
13.
			set told=99.99.999 
14.
15.
		if "%tnew%" LSS "%told%" echo %tnew% > %raw%txt 
16.
17.
)
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:

01.
set inp=C:\test\logtest\timings\nurburgring\ruf_yellowbird\RealDaveGER.new 
02.
 set raw=C:\test\logtest\timings\nurburgring\ruf_yellowbird\RealDaveGER. 
03.
 set tnew=2:19:654 
04.
 if exist C:\test\logtest\timings\nurburgring\abarth500_s1\alexis.thomas69.txt ( 
05.
set told=  0<C:\test\logtest\timings\nurburgring\abarth500_s1\alexis.thomas69.txt ) 
06.
 if not exist C:\test\logtest\timings\nurburgring\abarth500_s1\alexis.thomas69.txt (set told=99.99.999 ) 
07.
 if "2:19:654" LSS "99.99.999" echo 2:19:654  1>C:\test\logtest\timings\nurburgring\abarth500_s1\alexis.thomas69.txt 
08.
09.
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
Mitglied: rubberman
24.01.2015, aktualisiert um 16:22 Uhr
Hallo Dave, willkommen im Forum.

Ich denke du hast 2 Probleme.
  1. 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).
  2. 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
Bitte warten ..
Mitglied: realdaveger
24.01.2015, aktualisiert um 18:15 Uhr
ähmm ok, evtl. nicht gleich ersichtlich:

aus bsp. 2 15 547

wird hier:

01.
for /f %%A in ('dir /s /b timings\*.new') do (   
02.
	for /f "tokens=1,2,3 delims= " %%r in (%%A) do (  
03.
	echo %%r:%%s:%%t > %%A
2:15:547

dies ist der einzige Inhalt

zum anderen Punkt, wenn ich folgendes teste:

01.
if "2:19:654" LSS "99.99.999" echo true
dann wird meines erachtens richtig verglichen.

edit: problem erkannt, du hast recht!

setlocal ist in der batch mit aufgeführt, das hatte ich vergessen zu erwähnen. Leider bringt "EnableDelayedExpansion" keine Veränderung.

Gruß
Bitte warten ..
Mitglied: rubberman
24.01.2015 um 18:20 Uhr
Hallo Dave.

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
Bitte warten ..
Mitglied: rubberman
LÖSUNG 24.01.2015, aktualisiert 26.01.2015
OK, hab mal fix was zusammen geschrieben, was unabhängig davon immer funktionieren sollte.
01.
@echo off &setlocal 
02.
 
03.
set /a "current_num = 0, smallest_num = 9999999" 
04.
set "file=" 
05.
for /f "delims=" %%i in ('dir /a-d /b /s "timings\*.new"') do ( 
06.
  for /f "usebackq tokens=1-3" %%j in ("%%~i") do ( 
07.
    set /a "current_num = 100000 * (100%%j %% 100) + 1000 * (100%%k %% 100) + 1000%%l %% 1000" 
08.
    setlocal EnableDelayedExpansion 
09.
    echo !current_num! kleiner als !smallest_num! ? 
10.
    if !current_num! lss !smallest_num! ( 
11.
      endlocal 
12.
      set /a "smallest_num = current_num" 
13.
      set "file=%%~i" 
14.
    ) else endlocal 
15.
16.
17.
 
18.
echo Datei mit der kleinsten Nummernfolge: 
19.
echo "%file%" 
20.
pause
Grüße
rubberman
Bitte warten ..
Mitglied: realdaveger
26.01.2015 um 11:25 Uhr
Danke schon einmal vorab für die Hilfe,

mit Punkt und Doppelpunkt, hatte ich nur vergessen die shift taste zu drücken...

Grundsätzlich kann das erst einmal außer Betracht gelassen werden. Die Zeiten sehen wie folgt aus:

2 15 547 | ohne punkt oder doppelpunkt. Die 3 Tokens werden ja von deinem Script schon richtig verglichen. Das letzte Problem was halt besteht ist, das natürlich in der kompletten Struktur durchsucht wird und die niedrigste Zeit ausgegeben wird.

Es muss unterschieden werden in "Track\auto\fahrer\bestzeit.txt(/new)" -> so ist auch die ordnerstruktur aufgebaut. Neue Zeiten kommen in die Datei:

"x:\Track\auto\fahrer\bestzeit.new" und diese Zeit soll verglichen werden (wenn vorhanden) mit der bestehenden "x:\Track\auto\fahrer\bestzeit.txt", wenn die neue Zeit kleiner ist als die vorhandene, dann soll er diese überschreiben.

Mein Verständisproblem besteht darin, wie ich mit der ersten for Schleife die vorhandene Zeit auslesen kann.

Mein Ansatz wäre halt gewesen die erste Variable zu missbrauchen, indem die letzten 3 Zeichen abgeschnitten werden und neu gesetzt werden.

01.
set inp=%%A 
02.
set old=%inp:~0,-3%
Ich versuche mal weiter...

Grüße
Bitte warten ..
Mitglied: realdaveger
26.01.2015 um 13:59 Uhr
Ok ich habs hinbekommen.

Einmal für die Nachwelt:

01.
for /f %%A in ('dir /s /b timings\*.new') do ( 
02.
	SETLOCAL ENABLEDELAYEDEXPANSION 
03.
	set dat= 
04.
	set old= 
05.
	set told= 
06.
	set tnew= 
07.
	set tnewraw= 
08.
	set dat=%%A 
09.
	set old=!dat:~0,-3!txt 
10.
	if exist "!old!" for /f "tokens=1,2,3 delims= " %%f in ('type "!old!"') do set told=%%f%%g%%h 
11.
	if not exist "!old!" set told=9999999 
12.
	for /f "tokens=1,2,3 delims= " %%i in ('type "%%A"') do ( 
13.
		set tnew=%%i%%j%%k 
14.
		set tnewraw=%%i %%j %%k 
15.
16.
	if !tnew! LSS !told! echo !tnewraw! > "!old!" 
17.
	 
18.
	endlocal 
19.
)
Danke nochmal an dich, Radiergummimann
Bitte warten ..
Neuester Wissensbeitrag
Internet

Unbemerkt - Telekom Netzumschaltung! - BNG - Broadband Network Gateway

(3)

Erfahrungsbericht von ashnod zum Thema Internet ...

Ähnliche Inhalte
Batch & Shell
gelöst Batch die alle Dateien löscht die Älter als 3 Tage sind (5)

Frage von Azubine zum Thema Batch & Shell ...

Batch & Shell
gelöst Batch Änderungsdatum von Dateien vergleichen und ältere löschen (10)

Frage von 129528 zum Thema Batch & Shell ...

Batch & Shell
gelöst Per Batch FTP-Server Dateien ändern (1)

Frage von Marlon1 zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
Windows Server
Outlook Verbindungsversuch mit Exchange (15)

Frage von xbast1x zum Thema Windows Server ...

Grafikkarten & Monitore
Tonprobleme bei Fernseher mit angeschlossenem Laptop über HDMI (11)

Frage von Y3shix zum Thema Grafikkarten & Monitore ...

Microsoft Office
Keine Updates für Office 2016 (11)

Frage von Motte990 zum Thema Microsoft Office ...