String mit String vergleichen
per batch
Hi,
ich arbeite momentan an einer kleinen Batch (absoluter Newbie), die folgendes bewerkstelligen soll - die Suchfunktionen hier haben zwar einiges zu Tage gebracht, aber fähig, es auf mein Problem zu projizieren, war ich leider nicht
Bisheriges Vorgehen:
1. Ich erstelle die Datei in.txt
2. Ich lese eine Zeile aus quellen.txt aus
3. Ich vergleiche den String 'quelle' aus quellen.txt mit den Strings aus in.txt.
4. Wenn 'quelle' in einem der einzelnen Strings enthalten ist, soll kopiert werden
Punkt 1. und 2. habe ich bereits hinbekommen, allerdings scheitere ich an Punkt 3.
Bisher habe ich keine Idee (for-Schleife, find) gehabt, die bei mir zufriedenstellend funktioniert hat... ein strstr()-Aequivalent ist hier quasi gesucht, was am besten nur true/false zurückgibt (bei find geht das ja mit dem errorlevel... irgendwie, da hatte ich auch was ausprobiert)
Wie lässt sich das verwirklichen?
Lässt es sich eventuell einfacher lösen v.a. wegen den bei meiner Methoden sicher unnötigen Vergleichdurchgängen? Mein bisheriger Code...
(Bitte keinen Herzinfarkt kriegen, ich bin wirklich Anfänger! ;))
Würde mich über Hilfe sehr freuen,
Tanolde
Hi,
ich arbeite momentan an einer kleinen Batch (absoluter Newbie), die folgendes bewerkstelligen soll - die Suchfunktionen hier haben zwar einiges zu Tage gebracht, aber fähig, es auf mein Problem zu projizieren, war ich leider nicht
- In einer Datei quellen.txt sind Namen von Dateien enthalten, die in ein Verzeichnis X kopiert werden sollen. quellen.txt liegt in X.
- Ich erstelle eine Datei in.txt, die die Dateinamen mitsamt Pfad eines anderen Verzeichnisses Y enthält. Die Dateien, die in quellen.txt stehen, sollen dann nach X kopiert werden und zwar ohne Beachtung der in Y vorhandenen Ordnerstruktur, d.h. flach.
Bisheriges Vorgehen:
1. Ich erstelle die Datei in.txt
2. Ich lese eine Zeile aus quellen.txt aus
3. Ich vergleiche den String 'quelle' aus quellen.txt mit den Strings aus in.txt.
4. Wenn 'quelle' in einem der einzelnen Strings enthalten ist, soll kopiert werden
Punkt 1. und 2. habe ich bereits hinbekommen, allerdings scheitere ich an Punkt 3.
Bisher habe ich keine Idee (for-Schleife, find) gehabt, die bei mir zufriedenstellend funktioniert hat... ein strstr()-Aequivalent ist hier quasi gesucht, was am besten nur true/false zurückgibt (bei find geht das ja mit dem errorlevel... irgendwie, da hatte ich auch was ausprobiert)
Wie lässt sich das verwirklichen?
Lässt es sich eventuell einfacher lösen v.a. wegen den bei meiner Methoden sicher unnötigen Vergleichdurchgängen? Mein bisheriger Code...
(Bitte keinen Herzinfarkt kriegen, ich bin wirklich Anfänger! ;))
cd T:\Quellverzeichnis
T:
dir /b /s > V:\Zielverzeichnis\in.txt
cd V:\Zielverzeichnis
V:
FOR /f %%f IN (quellen.txt) DO @CALL :Compare %%f
pause
@Goto :eof
:Compare
@SET file=%1%
@SET 1=""
@echo %file%
FOR /f %%i IN (in.txt) DO @CALL :FindString %file% %%i
:eof
:FindString
@set ToFind=%file%
@set SearchIn=%2%
@echo %ToFind% %SearchIn%
Würde mich über Hilfe sehr freuen,
Tanolde
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 94292
Url: https://administrator.de/forum/string-mit-string-vergleichen-94292.html
Ausgedruckt am: 28.04.2025 um 23:04 Uhr
4 Kommentare
Neuester Kommentar
Hallo Tanolde und willkommen im Forum!
Eigentlich ließe sich das in einer (etwas längeren
) Zeile erledigen:
Das "echo" vor dem "copy" sorgt dafür, dass die Kopierbefehle nur angezeigt, aber noch nicht ausgeführt werden.
Bei Eingabe direkt an der Kommandozeile würde (nach dem Entfernen von "echo"
), falls im Zielverzeichnis bereits eine gleichnamige Datei vorhanden wäre, nach der Erlaubnis zum Überschreiben gefragt - in einem Batch (dort müssten dann alle "%"-Zeichen verdoppelt werden) würde ohne Rückfrage überschrieben werden (zu ändern über den "copy"-Schalter "/-y").
Falls das Quellverzeichnis sehr viele Dateien enthält, könnte die Verwendung einer Datei "in.txt" (wie von Dir vorgesehen, außer, dass ich sie eher im TEMP-Verzeichnis %temp% platzieren würde) Performancevorteile bringen - dann etwa:
Grüße
bastla
Eigentlich ließe sich das in einer (etwas längeren
@for /f "delims=" %f in (D:\quellen.txt) do @for /f "delims=" %i in ('dir /b /s /a-d "T:\Quellverzeichnis\%f"') do @echo copy "%i" "V:\Zielverzeichnis"
Bei Eingabe direkt an der Kommandozeile würde (nach dem Entfernen von "echo"
Falls das Quellverzeichnis sehr viele Dateien enthält, könnte die Verwendung einer Datei "in.txt" (wie von Dir vorgesehen, außer, dass ich sie eher im TEMP-Verzeichnis %temp% platzieren würde) Performancevorteile bringen - dann etwa:
@echo off & setlocal
set "Q=D:\quellen.txt"
set "QV=T:\Quellverzeichnis"
set "ZV=V:\Zielverzeichnis"
dir /b /s /a-d "%QV%">"%temp%\in.txt"
for /f "usebackq delims=" %%f in ("%Q%") do for /f "delims=" %%i in ('findstr /i /c:"%%f" "%temp%\in.txt"') do echo copy "%%i" "%ZV%"
bastla
Hallo Tanolde!
Je nachdem, was Du noch alles zu tun hast, könnte schon das Setzen von Klammern genügen, also
oder Du verwendest tatsächlich ein Unterprogramm (sinnvoll auch, wenn Du etwa noch mit aufeinander aufbauenden Variablen hantieren musst):
Das Unterprogramm ist wie ein eigener Batch zu betrachten, daher stehen die beim Aufruf übergebenen Parameter als %1, %2, etc (ohne ein weiteres "%" dahinter) zur Verfügung.
Vielleicht noch kurz zum Thema Anführungszeichen: Im Zweifelsfall setze ich sie, damit es keine Probleme mit im Dateinamen/-pfad enthaltenen Leerzeichen gibt, nehme sie aber grundsätzlich nicht in die Variable mit auf, sondern füge sie erst bei Verwendung wieder ein (das geht nämlich leichter, als sie im Fall des Falles entfernen zu müssen, etwa wenn sie bei einer Ausgabe mit "echo" unerwünscht wären).
Grüße
bastla
Je nachdem, was Du noch alles zu tun hast, könnte schon das Setzen von Klammern genügen, also
...
for /f "usebackq delims=" %%f in ("%Q%") do for /f "delims=" %%i in ('findstr /i /c:"%%f" "%temp%\in.txt"') do (
echo Weitere
echo Arbeitsschritte
echo copy "%%i" "%ZV%"
)
...
for /f "usebackq delims=" %%f in ("%Q%") do for /f "delims=" %%i in ('findstr /i /c:"%%f" "%temp%\in.txt"') do call :EditAndCopy "%%i"
goto :eof
:EditAndCopy
::Hier kommt der Parameter (%%i) als %1 an (inkl Anführungszeichen)
echo %1
echo %~1
set "String=%~1"
echo copy "%String%" "%ZV%"
::gleichwertig: echo copy %1 "%ZV%"
goto :eof
Vielleicht noch kurz zum Thema Anführungszeichen: Im Zweifelsfall setze ich sie, damit es keine Probleme mit im Dateinamen/-pfad enthaltenen Leerzeichen gibt, nehme sie aber grundsätzlich nicht in die Variable mit auf, sondern füge sie erst bei Verwendung wieder ein (das geht nämlich leichter, als sie im Fall des Falles entfernen zu müssen, etwa wenn sie bei einer Ausgabe mit "echo" unerwünscht wären).
Grüße
bastla