Per Batch Dateien mit Such-String im Dateinamen verschieben, wenn die Datei den Suchbegriff enthält
Hallo zusammen,
folgende Aufgabenstellung arbeiten wir recht zeitintensiv zz. noch manuell ab. Vielleicht gibt es dafür einen Batchansatz:
Zwei Verzeichnisse sollen überwacht und überprüft werden, ob ein bestimmter (vierstelliger) Ziffernstring einer Transfer(text)datei aus dem Ordner A in den variablen Dateinamen von Protokoll(text)dateien aus Ordner B enthalten sind. Darüberhinaus soll geprüft werden, ob in den gefundenen Dateien das Stichwort "Doppelt" vorkommt, wenn ja dann verschiebe die Transferdatei aus Verzeichnis A nach A_archiv und die Protokolldatei aus Verzeichnis B nach B_archiv.
Ich hoffe ich habe mich halbwegs verständlich ausgedrückt.
Besten Dank für Eure Hinweise!
Gruß,
meandmyself
folgende Aufgabenstellung arbeiten wir recht zeitintensiv zz. noch manuell ab. Vielleicht gibt es dafür einen Batchansatz:
Zwei Verzeichnisse sollen überwacht und überprüft werden, ob ein bestimmter (vierstelliger) Ziffernstring einer Transfer(text)datei aus dem Ordner A in den variablen Dateinamen von Protokoll(text)dateien aus Ordner B enthalten sind. Darüberhinaus soll geprüft werden, ob in den gefundenen Dateien das Stichwort "Doppelt" vorkommt, wenn ja dann verschiebe die Transferdatei aus Verzeichnis A nach A_archiv und die Protokolldatei aus Verzeichnis B nach B_archiv.
Ich hoffe ich habe mich halbwegs verständlich ausgedrückt.
Besten Dank für Eure Hinweise!
Gruß,
meandmyself
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 103679
Url: https://administrator.de/contentid/103679
Ausgedruckt am: 25.11.2024 um 20:11 Uhr
17 Kommentare
Neuester Kommentar
Hallo meandmyself!
Da es Dir außerdem keine Erwähnung wert war, gehe ich davon aus, dass bereits im Archivordner vorhandene gleichnamige Dateien kommentarlos überschrieben werden dürfen.
Ev wäre es auch noch sinnvoll gewesen, die Bedeutung der Begriffe "überwachen" und "überprüfen" etwas näher zu erklären, aber das kannst Du ja ggf nachholen ...
Nach meinem (bisherigen) Verständnis könnte es jedenfalls so gehen:
Grüße
bastla
Reicht das als Erläuterung?
Du hättest vielleicht noch klarstellen können, ob das Wort "Doppelt" in beiden (allen) betroffenen Dateien vorkommen muss, und ob dabei Groß-/Kleinschreibung zu beachten ist (was ich zunächst einmal nicht annehme und daher im Entwurf unten ignoriere).Da es Dir außerdem keine Erwähnung wert war, gehe ich davon aus, dass bereits im Archivordner vorhandene gleichnamige Dateien kommentarlos überschrieben werden dürfen.
Ev wäre es auch noch sinnvoll gewesen, die Bedeutung der Begriffe "überwachen" und "überprüfen" etwas näher zu erklären, aber das kannst Du ja ggf nachholen ...
Nach meinem (bisherigen) Verständnis könnte es jedenfalls so gehen:
@echo off & setlocal
set "OrdnerA=D:\A"
set "OrdnerB=D:\B"
set "OrdnerAArchiv=D:\A_Archiv"
set "OrdnerBArchiv=D:\B_Archiv"
for %%i in ("%OrdnerA%\RM*.txt") do findstr /i "Doppelt" "%%i">nul && call :ProcessFile "%%i"
goto :eof
:ProcessFile
set "Name=%~n1"
set "Nr=%Name:~-4%
for %%b in ("%OrdnerB%\SRG%Nr%.txt" "%OrdnerB%\SDB%Nr%.txt" "%OrdnerB%\errSRG%Nr%....txt" "%OrdnerB%\errSDB%Nr%....txt") do (
findstr /i "Doppelt" "%%b">nul 2>nul && (
if exist %1 move %1 "%OrdnerAArchiv%">nul
move "%%b" "%OrdnerBArchiv%">nul
)
)
goto :eof
bastla
Hallo meandmyself!
Jetzt drängen sich noch weitere Fragen auf ...
Kann es jeweils nur eine Protokolldatei geben?
Sieht die Struktur der Namen der Fehlerprotokolldateien tatsächlich so aus:
bzw wofür stehen anderenfalls die Punkte nach den 4 Ziffern?
Soferne ich das jetzt richtig verstanden habe: Muss der Inhalt der Transferdatei nicht auf das Vorhandensein von "doppelt" untersucht werden?
Grüße
bastla
Jetzt drängen sich noch weitere Fragen auf ...
die Dateien mit dem Tagesdatum sollen ausgeschlossen werden
Wozu eine permanente Überwachung, wenn aktuelle Dateien (btw: Ist mit "Tagesdatum" das Änderungsdatum gemeint? Welche Datei muss auf das Datum hin überprüft werden?) ohnehin nicht verarbeitet werden sollen?Kann es jeweils nur eine Protokolldatei geben?
Sieht die Struktur der Namen der Fehlerprotokolldateien tatsächlich so aus:
errSRGxxxx....txt
Soferne ich das jetzt richtig verstanden habe: Muss der Inhalt der Transferdatei nicht auf das Vorhandensein von "doppelt" untersucht werden?
Grüße
bastla
Hallo meandmyself!
Zum Testen:
Da jeweils vor "move" bzw vor dem "del" ein "echo" steht, werden die Befehle zum Verschieben bzw Löschen nur angezeigt - wenn Deine Tests ergeben, dass Du die Verwendung des Batches riskieren willst, einfach alle 4 "echo" entfernen.
Grüße
bastla
Zum Testen:
@echo off & setlocal
set "OrdnerA=D:\A"
set "OrdnerB=D:\B"
set "OrdnerAArchiv=D:\A_Archiv"
set "OrdnerBArchiv=D:\B_Archiv"
for %%i in ("%OrdnerA%\RM*.txt") do call :ProcessFile "%%i"
goto :eof
:ProcessFile
set "Name=%~n1"
set "Nr=%Name:~-4%
::Protokolldatei
for %%b in ("%OrdnerB%\SRG????%Nr%-*.txt" "%OrdnerB%\SDB????%Nr%-*.txt") do (
findstr /i "Doppelt" "%%b">nul 2>nul && (
for /f %%d in ("%%~tb") do if %%d neq %date% (
if exist %1 echo move %1 "%OrdnerAArchiv%"
echo move "%%b" "%OrdnerBArchiv%"
)
)
)
::Fehlerprotokolldatei
for %%b in ("%OrdnerB%\errSRG????%Nr%-*.txt" "%OrdnerB%\errSDB????%Nr%-*.txt") do (
findstr /i "Doppelt" "%%b">nul 2>nul && (
for /f %%d in ("%%~tb") do if %%d neq %date% (
if exist %1 echo move %1 "%OrdnerAArchiv%"
echo del "%%b"
)
)
)
goto :eof
Grüße
bastla
Hallo meandmyself!
Die Zeilen 17, 20, 27 und 30 sorgen für die Datumsprüfung der (Fehler-)Protokolldateien und wären dann vermutlich überflüssig ...
Grüße
bastla
wenn ich die Prüfung auf das Änderungsdatum nur auf die Transferdateien beziehen will
... müsste die Zeile 07 so aussehen:for %%i in ("%OrdnerA%\RM*.txt") do for /f %%d in ("%%~ti") do if %%d neq %date% call :ProcessFile "%%i"
Grüße
bastla
Hallo meandmyself!
Oben hast Du noch behauptet, die Namen würden so aussehen:
und (im Eröffnungsposting) der Zifferncode (ich nenne ihn einfach Nummer bzw Nr) wäre vierstellig - dementsprechend wird auch nach Dateien gesucht, welche nach dem "SRG" zunächst 4 beliebige Stellen (????), danach die Nummer und "-" und irgendein Datum (oder sonstiges oder nix) haben ...
Grüße
bastla
Oben hast Du noch behauptet, die Namen würden so aussehen:
RM59761234.txt
SRG59761234-20081205.txt
set "Name=%~n1"
Das Unterprogramm ":ProcessFile" wird mit Übergabe des kompletten Dateipfades der Trasferdatei aufgerufen - diese Zeile entnimmt diesem Pfad nur den Namen (ohne die Extension ".txt").set "Nr=%Name:~-4%
Da die letzten 4 Zeichen des Namens die zur Identifikation benötigte Nummer enthalten, wird diese extrahiert und als %Nr% gespeichert.Grüße
bastla
Hallo meandmyself!
Dann also etwa so:
Grüße
bastla
Dann also etwa so:
@echo off & setlocal
set "OrdnerA=D:\A"
set "OrdnerB=D:\B"
set "OrdnerAArchiv=D:\A_Archiv"
set "OrdnerBArchiv=D:\B_Archiv"
for %%i in ("%OrdnerA%\RM*.txt") do for /f %%d in ("%%~ti") do if %%d neq %date% call :ProcessFile "%%i"
goto :eof
:ProcessFile
set "Name=%~n1"
set "Nr=%Name:~-8%
::Protokolldatei
for %%b in ("%OrdnerB%\SRG%Nr%-*.txt" "%OrdnerB%\SDB%Nr%-*.txt") do (
findstr /i "Doppelt" "%%b">nul 2>nul && (
if exist %1 echo move %1 "%OrdnerAArchiv%"
echo move "%%b" "%OrdnerBArchiv%"
)
)
::Fehlerprotokolldatei
for %%b in ("%OrdnerB%\errSRG%Nr%-*.txt" "%OrdnerB%\errSDB%Nr%-*.txt") do (
findstr /i "Doppelt" "%%b">nul 2>nul && (
if exist %1 echo move %1 "%OrdnerAArchiv%"
echo del "%%b"
)
)
goto :eof
bastla