listigerteppich
Goto Top

Batch dynamischer Stringvergleich möglich ?

Hallo beisammen,

Ich schreibe an einer Batch Datei und habe mir folgendes "Feature" überlegt:

Das Skript soll Zeichenketten von Dateien Vergleichen. Stimmen 2 Dateien überein so sollen die Dateinamen in ein Logfile geschrieben werden.

Die beiden Dateinamen sind beispielsweise wie folgt aufgebaut :

Datei 1:

KR12312342314.txt

Datei2:

UE12312342314.txt

Ziel ist es also innerhalb eines Ordners jeweils die "Dateipaare" zu finden bei denen lediglich die Zahlenreihe exakt übereinstimmt.

Man müsste quasi den Dateinamensstring zwischen den führenden 2 Buchstaben und dem Punkt des Suffix auslesen und vergleichen. Hat von euch einer eine Idee ob bzw. wie das in einer Batch umzusetzen ist?


Grüße

Content-Key: 129291

Url: https://administrator.de/contentid/129291

Ausgedruckt am: 28.03.2024 um 20:03 Uhr

Mitglied: bastla
bastla 13.11.2009 um 11:22:28 Uhr
Goto Top
Hallo listiger Teppich!

Ganz grundsätzlich: Um Substrings bilden zu können, müssen die Dateinamen in "gewöhnlichen" Variablen (also nicht Laufvariablen wie %%i oder Parametervariablen wie %1) gespeichert sein - für die Variablen %Dateiname1% und %Dateiname2% dann etwa so:
if /i "%Dateiname1:~2%"=="%Dateiname1:~2%" echo Uebereinstimmung: %Dateiname1%_%Dateiname2%
Mehr dazu in der Onlinehilfe (Aufruf mit "set /?") ...

Grüße
bastla
Mitglied: listigerTeppich
listigerTeppich 13.11.2009 um 12:02:08 Uhr
Goto Top
ah, danke schonma. Ich hab noch vergessen explizit zu erwähnen, dass die Formate der Dateien variieren können. Kann man das auch noch abfangen?
Mitglied: bastla
bastla 13.11.2009 um 15:00:07 Uhr
Goto Top
Hallo listiger Texppich!

Um einen ganzen Ordner auszuwerten (woher die Dateinamen stammen, hast Du ja bisher leider nicht beschrieben), könnte der Batch etwa so aussehen:
@echo off & setlocal
set "Ordner=D:\Test"  
set "Erg=D:\Ergebnis.txt"  
set "Delim=_"  

pushd "%Ordner%"  
copy nul "%Erg%">nul  
for /f "delims=" %%i in ('dir /b /a-d') do findstr /i /c:"%%i" "%Erg%">nul || call :ProcessFile "%%i"  
popd
goto :eof

:ProcessFile
set "Name=%~n1"  
::Falls nur eine Datei zu erwarten ist: nur eine Ausgabezeile
for /f "delims=" %%i in ('dir /b "??%Name:~2%.*" 2^>nul ^|findstr /v /i /c:%1') do >>"%Erg%" echo %~1%Delim%%%i  
::Falls mehrere Dateien: mehrere Ausgabezeilen
::dir /b "??%Name:~2%.*" 2^>nul |findstr /v /i /c:%1 >nul && (dir /b "??%Name:~2%.*" & echo\)>>"%Erg%" 
goto :eof
Für den Fall, dass nicht nur von zwei "passenden" Dateien auszugehen wäre, könntest Du die Zeile 15 durch das voranstellen von "::" deaktivieren und stattdessen die Zeile 17 (durch Entfernen der Kommentarzeichen "::") verwenden.

Grüße
bastla
Mitglied: 5t8d1e
5t8d1e 13.11.2009 um 15:10:19 Uhr
Goto Top
Hallo,

hier ganz "simpel" in Powershell

$a = "KR12312342314.txt"  
$b = "UE12312342314.txt"  
$c = $a.IndexOfAny(".")-2  
$d = $a.Substring(2,$c)

$b -match $d

und hier in Batch
SET d1=KR12312342314.txt
SET d2=UE12312342314.txt
for  %%a in (%d1%) do set b=%%~na
for  %%c in (%d2%) do set d=%%~nc
set e=%b:~2%
set f=%d:~2%

if %e%==%f% (Echo True) Else (Echo False)

Torsten
Mitglied: listigerTeppich
listigerTeppich 16.11.2009 um 11:40:33 Uhr
Goto Top
Danke an euch beide. Die Lösung von Bastla ist exakt das wonach ich gesucht habe. echt Super ! Eine kleine Frage(-erweiterung) habe ich jedoch noch. Wie kann ich es umsetzten, dass nicht wie angenommen ein einzelner Ordner ausgewertet werden soll sondern 2 verschiedene. Die beiden verschiedenen Dateien würden also jeweils in einem anderen Ordner liegen. In den beiden Ordnern liegen jeweils mehrere Dateien.

Evtl. kurz zur Hintergrunderklärung: Wir bekommen mehrere Nachrichten mit signierten Anhängen. Die signierte Protokolldatei einer Datendatei wird separat mitgeschickt und automatisiert in einen Protokoll-Ordner abgelegt. Ziel ist nun die Ausgabe einer Liste von Dateipaaren, welche die Anforderung erfüllen, dass die Datendatei (in Ordner A) sowie auch die Protokolldatei (in Ordner B) vorhanden ist.
Die Zuordnung einer Datei zur jeweiligen Protokolldatei funktioniert mit Bastlas-skript, für den Fall dass sich beide Dateien im selben Ordner befinden, schon tadellos. Weiss jemand vl. wie man noch die verschiedenen Eingangsordner gehandelt bekommt ?
Mitglied: bastla
bastla 16.11.2009 um 14:58:10 Uhr
Goto Top
Hallo listiger Teppich!

Das sollte dann etwa so zu machen sein:
@echo off & setlocal
set "Ordner1=D:\Test"  
set "Ordner2=D:\Sigs"  
set "Erg=D:\Ergebnis.txt"  
set "Delim=_"  

for /f "delims=" %%i in ('dir /b /a-d') do call :ProcessFile "%%i"  
goto :eof

:ProcessFile
set "Name=%~n1"  
::Falls nur eine Datei zu erwarten ist: nur eine Ausgabezeile
for /f "delims=" %%i in ('dir /b "%Ordner2%\??%Name:~2%.*" 2^>nul ^|findstr /v /i /c:%1') do >>"%Erg%" echo %~1%Delim%%%i  
::Falls mehrere Dateien: mehrere Ausgabezeilen
::dir /b "%Ordner2%\??%Name:~2%.*" 2^>nul |findstr /v /i /c:%1 >nul && (dir /b "%Ordner2%\??%Name:~2%.*" & echo\)>>"%Erg%" 
goto :eof
Grüße
bastla
Mitglied: listigerTeppich
listigerTeppich 18.11.2009 um 12:07:44 Uhr
Goto Top
Hallo Bastla !

ja, das funktioniert schon echt gut, nur wird dann bei dieser Umsetzung das logfile (%logdir%\log.txt) gar nicht aufgerufen:

for /f "delims=" %%i in ('dir /b /a-d %protdir%\UE*') do call :ProcessFile "%%i"
goto :eof

:ProcessFile
set "Name=%~n1"
dir /b "%datadir%\??%Name:~2%.*" 2^>nul |findstr /v /i /c:%1 >nul && (dir /b "%datadir%\??%Name:~2%.*" & echo\)>> %logdir%\log.txt
goto :eof

echo Skript beendet am %date:~0% - %time:~0,8% Uhr >> %logdir%\log.txt

cd %logdir%
log.txt

wenn ich beide "goto :eof" auskommentiere wird das logfile (%logdir%\log.txt) für jedes gefundene Dateienpaar separat aufgerufen. Kannst du mir evtl. noch sagen wie ich es hinbekomme, dass das logfile erst aufgerufen wird wenn der Unterprozess ":ProcesFile" komplett durchgelaufen ist ?
Mitglied: bastla
bastla 18.11.2009 um 13:26:23 Uhr
Goto Top
Hallo listiger Teppich!

Da das Script mit dem ersten "goto :eof" endet (danach folgt nur noch ein Unterprogramm), brauchst Du eigentlich nur unmittelbar davor die Zeile
"%logdir%\log.txt"
einzufügen.

Grüße
bastla

P.S.: Bitte zum Posten von Code die passende verwenden ...
Mitglied: listigerTeppich
listigerTeppich 18.11.2009 um 14:17:00 Uhr
Goto Top
ah, sehr schön. Problem gelöst, Danke !