Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

Per Batch nach bestimmten Ordnern und Dateien suchen

Frage Entwicklung Batch & Shell

Mitglied: LPRathmann

LPRathmann (Level 1) - Jetzt verbinden

17.05.2010 um 12:24 Uhr, 11459 Aufrufe, 8 Kommentare

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!
Mitglied: LotPings
17.05.2010 um 13:04 Uhr
Hallo,

probiere mal dies (ungetestet):
01.
@Echo off 
02.
Set "Base=c:\temp\csv_bereich1\Maschine\Prod Daten\1" 
03.
Pushd  %Base% 
04.
For /f "delims=" %%A in ( 
05.
  'Dir /B/AD ?????? ^|Findstr "^[0-9][0-9][0-9][0-9][0-9][0-9]$"' 
06.
) 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
Bitte warten ..
Mitglied: LPRathmann
17.05.2010 um 14:08 Uhr
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
Bitte warten ..
Mitglied: LotPings
17.05.2010 um 15:05 Uhr
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.
Bitte warten ..
Mitglied: LPRathmann
18.05.2010 um 08:39 Uhr
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.
Bitte warten ..
Mitglied: LotPings
18.05.2010 um 09:05 Uhr
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
Bitte warten ..
Mitglied: LPRathmann
18.05.2010 um 10:21 Uhr
Zitat von LotPings:
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?
Bitte warten ..
Mitglied: LPRathmann
20.05.2010 um 10:09 Uhr
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%
Bitte warten ..
Mitglied: LotPings
20.05.2010 um 10:46 Uhr
Zitat von LPRathmann:
ich hab noch ein weiteres Problem, hoffe das ist ok, wenn ich gleich hier weiterschreibe.

So als erziehreische Maßnahme, nein

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
Bitte warten ..
Neuester Wissensbeitrag
Festplatten, SSD, Raid

12TB written pro SSD in 2 Jahren mit RAID5 auf Hyper-VServer

Erfahrungsbericht von Lochkartenstanzer zum Thema Festplatten, SSD, Raid ...

Ähnliche Inhalte
Batch & Shell
gelöst Per Batch Konfliktdateien in Dropbox suchen (4)

Frage von nobbi49 zum Thema Batch & Shell ...

Batch & Shell
gelöst Batch die alle Dateien löscht die Älter als 3 Tage sind (5)

Frage von Azubine zum Thema Batch & Shell ...

Batch & Shell
gelöst Batch Änderungsdatum von Dateien vergleichen und ältere löschen (10)

Frage von 129528 zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
Windows Userverwaltung
Ausgeschiedene Mitarbeiter im Unternehmen - was tun mit den AD Konten? (34)

Frage von patz223 zum Thema Windows Userverwaltung ...

LAN, WAN, Wireless
gelöst Server erkennt Client nicht wenn er ausserhalb des DHCP Pools liegt (28)

Frage von Mar-west zum Thema LAN, WAN, Wireless ...

LAN, WAN, Wireless
FritzBox, zwei Server, verschiedene Netze (21)

Frage von DavidGl zum Thema LAN, WAN, Wireless ...

Viren und Trojaner
Aufgepasst: Neue Ransomware Goldeneye verbreitet sich rasant (20)

Link von Penny.Cilin zum Thema Viren und Trojaner ...