lprathmann
Goto Top

Per Batch nach bestimmten Ordnern und Dateien suchen

Hallo zusammen,

ich sitze aktuell an einem Problem und komme einfach nicht ganz ans Ziel. Ich habe schon einige Ansätze hier im Forum gefunden, trotzdem benötige ich noch Hilfe.
Ich hoffe ihr könnt mir helfen.

Ich möchte nach bestimmten Ordner und Dateien suchen (die Dateien sollen letztlich kopiert werden).

Der Part "c:\temp\csv_bereich1\Maschine\Prod Daten" ist dabei immer fix.
Darunter können dann viele Ordner liegen.

Es sind aber nur die Ordner relevant, die aus einer 6-stelligen Zahl bestehen, also z.B.

c:\temp\csv_bereich1\Maschine\Prod Daten\123456

Darunter liegt dann jeweils noch die zwei Ordner "Bilder" und "Fehler". Hier ist wiederum nur der Ordner "Fehler" relevant, in der letztlich die Zieldatei liegt.
Die Zieldatei besteht dabei genau aus 6 Zahlen des Ordners oben, also

c:\temp\csv_bereich1\Maschine\Prod Daten\123456\Fehler\123456.txt

Diese Datei will ich finden (und kopieren).

So kann die gesamte Verzeichnisstruktur aussehen:

c:\temp\csv_bereich1\Maschine\Prod Daten\123456
c:\temp\csv_bereich1\Maschine\Prod Daten\123456_NOT
c:\temp\csv_bereich1\Maschine\Prod Daten\TEST
c:\temp\csv_bereich1\Maschine\Prod Daten\654321
c:\temp\csv_bereich1\Maschine\Prod Daten\blabla

usw...

Ich habe es mit findstr und regulären Ausdrücken versucht, aber komme nicht ganz ans Ziel.
Kann man damit auch nach Ordnern suchen, so dass eben nur die Ordner "123456" und "654321" betrachtet werden?

Also 1. Suche:

c:\temp\csv_bereich1\Maschine\Prod Daten\123456
c:\temp\csv_bereich1\Maschine\Prod Daten\654321

Dann könnte es so weiter aussehen:

c:\temp\csv_bereich1\Maschine\Prod Daten\123456\Bilder\b1.bmp
c:\temp\csv_bereich1\Maschine\Prod Daten\123456\Bilder\b2.bmp
c:\temp\csv_bereich1\Maschine\Prod Daten\123456\Bilder\b3.bmp
c:\temp\csv_bereich1\Maschine\Prod Daten\123456\Fehler\123456.txt
c:\temp\csv_bereich1\Maschine\Prod Daten\654321\Bilder\b1.bmp
c:\temp\csv_bereich1\Maschine\Prod Daten\654321\Bilder\b2.bmp
c:\temp\csv_bereich1\Maschine\Prod Daten\654321\Fehler\654321.txt

Endergebnis sollendann also nur die 2 Dateien "123456.txt" und "654321.txt" sein, die ich dann kopiere.

Ich hoffe, ich habs verständlich erklärt.

Da unter dem Ordner "\Prod Daten" sehr viele Ordner sein können, wäre es außerdem sehr gut, wenn ich zusätzlich über das Datum einschränken könnte.
D.h. es sollen nur Ordner betrachtet werden, deren "Geändert am"-Datum nicht älter ist als 2 Tage. Geht das?
Ich habe gelesen, dass bei "XCOPY /D" eine Datumsangabe möglich ist, aber idealerweise sollte diese Einschränkung nicht erst beim Kopieren erfolgen...

Vielen Dank im Voraus!

Content-ID: 142946

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

Ausgedruckt am: 25.11.2024 um 19:11 Uhr

77559
77559 17.05.2010 um 13:04:46 Uhr
Goto Top
Hallo,

probiere mal dies (ungetestet):
@Echo off
Set "Base=c:\temp\csv_bereich1\Maschine\Prod Daten\1"  
Pushd  %Base%
For /f "delims=" %%A in (  
  'Dir /B/AD ?????? ^|Findstr "^[0-9][0-9][0-9][0-9][0-9][0-9]$"'  
) Do if Exist "%Base%\%%A\Fehler\%%A.txt" Echo Copy "%Base%\%%A\Fehler\%%A.txt" "X:\wohinauchimmer\"  

Wenn die Ausgabe korrekt erscheint das Echo vor copy entfernen.

Gruß
LotPings


Edit: ein Anführungszeichen nachgereicht face-wink
LPRathmann
LPRathmann 17.05.2010 um 14:08:10 Uhr
Goto Top
Hallo LotPings,

danke für die schnelle Anwort. Und es scheint zu gehen, vielen Dank!

Damit ichs auch richtig verstehe. Die ?????? suchen im Verzeichnis alles was maximal 6stellig ist? Also 1-6 stellig? Und davon dann über den regulären Ausdruck "^[0-9][0-9][0-9][0-9][0-9][0-9]$" alles was 6stellige Zahlen sind?

Das Optimum wäre jetzt, wenn ich nur in den Verzeichnissen suchen muss, deren Änderungsdatum nicht älter als 2 Tage ist. Denn das Verzeichnis unter \Prod Daten kann riesig werden...
Geht sowas?

grüße
77559
77559 17.05.2010 um 15:05:15 Uhr
Goto Top
Zitat von @LPRathmann:
Das Optimum wäre jetzt, wenn ich nur in den Verzeichnissen suchen muss, deren Änderungsdatum nicht älter als 2 Tage
ist. Denn das Verzeichnis unter \Prod Daten kann riesig werden...
Geht sowas?

Das geht schon, macht die Batchdatei aber erheblich komplexer, da Datumsberechnungen in purem Batch eine Qual sind.
Es sind ja die unterschiedlichsten Datumsformate zu berücksichtigen (Ich habe zum Beispiel JJJJ-MM-TT eingestellt).

Als ersten Schritt kannst du hinter dem Dir zusätzlich die Option /O-D einfügen, dann geht er nach absteigendem Datum vor - die neuesten werden also zuerst geprüft.

Gruß
LotPings

Edit: Deine vorherige Interpretation des Batches ist korrekt - hab ich vergessen zu erwähnen.
LPRathmann
LPRathmann 18.05.2010 um 08:39:23 Uhr
Goto Top
Ok, vielen Dank dann soweit!
Ich setze das ganze mal auf gelöst, auch wenn ich das mit dem Datum (nicht älter als 2 Tage) idealerweise auch brauchen würde...
Aber wenn das wirklich soviel Zusatzaufwand ist, dann lassen wir das erstmal.
77559
77559 18.05.2010 um 09:05:06 Uhr
Goto Top
Zitat von @LPRathmann:
Ok, vielen Dank dann soweit!
Ich setze das ganze mal auf gelöst, auch wenn ich das mit dem Datum (nicht älter als 2 Tage) idealerweise auch brauchen
würde...
Aber wenn das wirklich soviel Zusatzaufwand ist, dann lassen wir das erstmal.
Wie lange braucht denn jetzt ein kompletter Durchlauf?
Wieviele Ordner sind es denn insgesamt?

Es läßt sich lösen mit purem Batch, aber wenn du durch die zusätzlichen Berechnungen keine Zeit sparst - wöfür?
Datum-Zeit des Ordners lässt sich in der Schleife mit "%%~tA" abfragen aber da mus die Zeit abgeschnitten werden, und solange du kein sortierfähiges Datumsformat hast, kann nicht einfach das Datum mit größer als vergleichen.
Einen Vergleichswert Datum minus 2 Tage musst du auch erst errechnen.

Diese Berechnungen kann mit einer VBscript Hilfs-Routine viel einfacher durchführen, aber dann kann man auch gleich das ganze mit besserer Laufzeit in VBS machen. Das ist aber dann deutlich umfangreicher. Wenn ich Zeit habe schau ich mal danach.

Gruß
LotPings
LPRathmann
LPRathmann 18.05.2010 um 10:21:59 Uhr
Goto Top
Zitat von @77559:
Wie lange braucht denn jetzt ein kompletter Durchlauf?
Wieviele Ordner sind es denn insgesamt?

Wie lang es wirklich dauert hab ich noch nicht getestet, da ich erstmal in meiner Testumgebung probiere...
Pro Tag kommt 1 Ordner dazu, d.h. 365 Ordner pro Jahr. Daher die Idee, dass nicht jedesmal alle durchsucht werden, aber wenns von der Geschwindigkeit her nix ausmacht, wär das natürlich auch ok.

Dann kann ich aber doch wenigstens mit XCOPY /D: DATUM
wobei DATUM = sysdate - 2 (rein logisch jetzt) gesetzt wird, arbeiten? Dass zumindest nur die tatsächlich kopiert werden, die nicht älter als 2 Tage sind?
LPRathmann
LPRathmann 20.05.2010 um 10:09:07 Uhr
Goto Top
Hallo,

ich hab noch ein weiteres Problem, hoffe das ist ok, wenn ich gleich hier weiterschreibe.
Ich möchte die Dateien nur EINMAL kopieren, daher dachte ich, dass ich xcopy /EXCLUDE einsetze.

D.h. über xcopy /exclude:exclude.txt && echo %%i.txt >> exlucde.txt

wobei %%i.txt die gefundenen Text-Dateien sind.

Das funktioniert im Prinzip auch, leider schreibt er aber immer die gefundenen DAteien in die Datei exclude.txt. Ich möchte aber, dass die Dateien nur in die exclude.txt geschrieben werden, wenn die Datei auch kopiert wird, sonst hab ich sie ja zig mal drin stehen.
Hab mit errorlevel experimentiert, aber komme nicht hin.

Beispiel:
1.Durchlauf
3 gefunden Dateien 123456.txt, 234567.txt, 345678.txt
=> sollen kopiert werden
=> Dateinamen sollen zusätzlich in exclude.txt geschrieben werden

2.Durchlauf
3 gefunden Dateien 123456.txt, 234567.txt, 345678.txt (also keine neuen!)
=> sollen nicht kopiert werden (Ausschluss über exclude.txt)
=> Dateinamen sollen NICHT in exclude.txt geschrieben werden

3.Durchlauf
4 gefunden Dateien 123456.txt, 234567.txt, 345678.txt, 456789.txt (also 1 neue!)
=> 456789.txt soll kopiert werden (die anderen Ausschluss über exclude.txt)
=> nur Dateiname 456789.txt sollen in exclude.txt geschrieben werden

Hier mein bisheriger Code (der aber jedesmal in die exclude.txt schreibt):

@echo off
Set "Base=C:\temp\csv\source"
Set "Target=C:\temp\csv\target"
Set "LogFile=exclude.txt"

pushd %base%

if not exist %LogFile% copy NUL %LogFile%

For /f "delims=" %%i in ('Dir /B/AD /O-D ?????? ^|Findstr "^[0-9][0-9][0-9][0-9][0-9][0-9]$"') Do if Exist "%%i\Trendfehler\%%i.txt" xcopy "%%i\Trendfehler\%%i.txt" %target% /d /exclude:%LogFile% && if %errorlevel% == 0 echo %%i.txt >> %LogFile%
77559
77559 20.05.2010 um 10:46:23 Uhr
Goto Top
Zitat von @LPRathmann:
ich hab noch ein weiteres Problem, hoffe das ist ok, wenn ich gleich hier weiterschreibe.

So als erziehreische Maßnahme, nein face-wink

Im Ernst, Änderungen hier sehen nur die, die bereits beteiligt waren und die Erinnereung gesetzt haben.
Du vergrößerst deine Chancen auf Antworten mit einem neuen Beitrag, den ALLE sehen.
Ich übersehe auch schon etwas und habe auch nicht immer si Zeit zu reagieren.

Ich habe deshalb auch deine Frage gar nicht weiter durchgelesen.

Gruß
LotPings