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
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
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 129291
Url: https://administrator.de/forum/batch-dynamischer-stringvergleich-moeglich-129291.html
Ausgedruckt am: 13.04.2025 um 23:04 Uhr
9 Kommentare
Neuester Kommentar
Hallo listiger Teppich!
Ganz grundsätzlich: Um Substrings bilden zu können, müssen die Dateinamen in "gewöhnlichen" Variablen (also nicht Laufvariablen wie
Mehr dazu in der Onlinehilfe (Aufruf mit "
Grüße
bastla
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%
set /?
") ...Grüße
bastla
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:
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
Um einen ganzen Ordner auszuwerten (woher die Dateinamen stammen, hast Du ja bisher leider nicht beschrieben), könnte der Batch etwa so aussehen:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
@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
Grüße
bastla
Hallo,
hier ganz "simpel" in Powershell
und hier in Batch
Torsten
hier ganz "simpel" in Powershell
1
2
3
4
5
6
2
3
4
5
6
$a = "KR12312342314.txt"
$b = "UE12312342314.txt"
$c = $a.IndexOfAny(".")-2
$d = $a.Substring(2,$c)
$b -match $d
und hier in Batch
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
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
Hallo listiger Teppich!
Das sollte dann etwa so zu machen sein:
Grüße
bastla
Das sollte dann etwa so zu machen sein:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@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
bastla