cyberdevil0815
Goto Top

Batch soll dateitypen rekursiv suchen, umlagern und in einer Textdatei alten Pfad speichern

4 verschieden Dateitypen rekursiv suchen, umlagern (ausschneiden und einfügen) und in einer *.txt Datei den ALTEN Pfad inkl. Dateiendung abspeichern

Hallo zusammen,

dann habe ich noch eine Frage zu meinen vorherigen posting, welches mit Zusammenarbeit, Tipps udn Tricks schnell und effizient gelöst wurde.

Hierbei handelt es sich eigentlich um eine Erweiterung des Postings: Batch Datei um Ordner zu suchen und Inhalt löschen

Hier ging es darum, einen bestimmten Dateityp rekursiv zu suchen und diesen OHNE Eingabeafforderung zu löschen. Hierbei handelt es sich natürlich um eine tabula rasa Methode, da NICHTS gespeichert, gesichert und einfach "blind" gelöscht wird, was diesem Dateityp entspricht.

Ich würde nun gerne einen Batch schreiben, welcher:

A. 4 Bestimmte Dateitypen rekursiv auf 3 vorgebenen Netzlaufwerkpfaden / UNC sucht, findet
B. Diese Dateien ausschneidet, an einen vordefinierten Netzpfad einfügt und
C. Den alten Pfad der Datei in einem Textdokument speichert.

Geht sowas? Wenn ja, wie fang ich diesen Batch an zu schreiben? Ich will keinen runtergerasselten Code / Schreibweise, sondern erst mal nur Denkanstösse, am Ende des Postings kann gerne der gesamte Code gepostet werden.

Content-ID: 171197

Url: https://administrator.de/forum/batch-soll-dateitypen-rekursiv-suchen-umlagern-und-in-einer-textdatei-alten-pfad-speichern-171197.html

Ausgedruckt am: 23.12.2024 um 16:12 Uhr

bastla
bastla 09.08.2011 um 15:03:06 Uhr
Goto Top
Hallo cyberdevil0815!

Was meinst Du mit
an einen vordefinierten Netzpfad einfügt
?
Übrigens wäre die Reihenfolge A-C-B sinnvoller [Edit] (auch zB, wenn T-Mos Vorschlag "7zip" zum Tragen käme - Stichwort "@listfile") [/Edit] ...

Grüße
bastla
60730
60730 09.08.2011 um 15:07:33 Uhr
Goto Top
moin,

  • echo on
  • set /p
  • for
  • dir /a-d /s>>
  • 7zip
  • del

gruß
Skyemugen
Skyemugen 09.08.2011 um 15:34:32 Uhr
Goto Top
Aloha,

geht alles face-wink Zum Beispiel mit Hilfe dieser Denkanstöße oder auch anders :P

  • set "Typen=*.bak *.dwg *.dxf *.ipt"
  • set "Pfad1="
  • set "Pfad2=
  • set "Pfad3="
  • set "LOG="
  • set "Ziel="
  • for %%s in (%Pfad1% %Pfad2% %Pfad3%)
  • pushd
  • for /f "delims=" %%m in ('dir /b /s %Typen%')
  • >> echo
  • move
  • popd

@bastla
Ich denke an einen vordefinierten Netzpfad einfügt dürfte einem move soundso nach dortunddort entsprechen.

greetz André
bastla
bastla 09.08.2011 um 15:51:11 Uhr
Goto Top
@Skyemugen
Falls Du mit
move soundso nach dortunddort
etwas in der Art
move "D:\Ordner\Unterordner\Unterunterordner\Name.Typ" "\\Server\Share\Ordner\Unterordner\Unterunterordner\Name.Typ"
(also gleichen (Teil-)Pfad) meinen solltest, wären wir auf der gleichen Linie ...
Da schon so viele Befehle genannt wurden - wie wäre es mit "xcopy /L"? "Move" kann übrigens auch "robocopy" ...

Grüße
bastla
cyberdevil0815
cyberdevil0815 10.08.2011 um 07:58:28 Uhr
Goto Top
Moin zusammen,

@bastla, vordefinierte Netzpfad ==> die erkannten Dateien und Pfade sollen komplett in einen Pfad i:\sicherung_batch\ abgelegt werden. Sprich die Umlagerung\Bewegen erfolgt als Sammelsurium in einem Ordner und werden einfach reingelegt.

Ich hoffe das ist verständlich genug?!

@skyemuggen:

ich muss mal eben Deinen Quellcode auseinander pflücken, ob ich diesen auch richtig verstanden habe:

set=typen... ==> Festlegen der Suchkriterien in Form von Dateitypen
Set "Pfad" ==> Festelegen der Netzpfade wo gesucht werden kann. Also auch den kompletten Inhalt von Netzwerk X.
set Log ==> Angabe wo das Log fest hingeschrieben werden soll
set Ziel ==> Festlegen wohin die gefundenen Dateien ausgelagert werden sollen
for $s in ... ==> für welche Pfade die Umlagerung gültig ist ?
pushd ==> macht was genau...lagert dieses Kommando die Dateien um, weil dafür habe doch eigentlich move?
for /f .. ==> wobei dir/b /s nach Größe und Pfad sortieren sollte
move ==> hier sollte die Umlagerung der Dateien erfolgen
popd ==> was macht das?

Habe ich das korrekt interpretiert?!
Skyemugen
Skyemugen 10.08.2011 um 08:42:29 Uhr
Goto Top
Zitat von @cyberdevil0815:
Moin zusammen,
Aloha,
@bastla, vordefinierte Netzpfad ==> die erkannten Dateien und Pfade sollen komplett in einen Pfad i:\sicherung_batch\ abgelegt werden. Sprich die Umlagerung\Bewegen erfolgt als Sammelsurium in einem Ordner und werden einfach reingelegt.
Nogo, wenn Namensgleiche Dateien vorhanden sind, hast du dein Chaos.

@skyemuggen:

WTH!

ich muss mal eben Deinen Quellcode auseinander pflücken, ob ich diesen auch richtig verstanden habe:
set=typen... ==> Festlegen der Suchkriterien in Form von Dateitypen
Korrekt.
Set "Pfad" ==> Festelegen der Netzpfade wo gesucht werden kann. Also auch den kompletten Inhalt von Netzwerk X.
Korrekt, sucht ab der Ebene, die du angibst.
set Log ==> Angabe wo das Log fest hingeschrieben werden soll
Jupp.
set Ziel ==> Festlegen wohin die gefundenen Dateien ausgelagert werden sollen
In der Tat.
for $s in ... ==> für welche Pfade die Umlagerung gültig ist ?
Irgendwie muss man es ja umsetzen, dass er mehrere Pfade abarbeitet face-wink - Ist auch noch nicht perfekt ^_^ nur erst einmal ein Anhaltspunkt, für Leerzeichen im Pfad muss optimiert werden.
pushd ==> macht was genau...lagert dieses Kommando die Dateien um, weil dafür habe doch eigentlich move?
cmd => pushd /? face-wink wechselt in das Verzeichnis und speichert das Ausgangsverzeichnis (sofern er die Variable der Schleife erhält, versteht sich face-wink)
for /f .. ==> wobei dir/b /s nach Größe und Pfad sortieren sollte
Wie was wo sortieren? Es durchsucht den aktuellen Pfad von pushd nach Typen, du hast nie etwas von Größe sortieren gesagt, was auch wenig Sinn macht, wenn alles in einem Behälter landet und dort eh alphabetisch wieder angezeigt wird.
move ==> hier sollte die Umlagerung der Dateien erfolgen
Korrekt.
popd ==> was macht das?
Das Gegenstück zu pushd: Es springt wieder aus dem Verzeichnis hinaus ins Ausgangsverzeichnis
Habe ich das korrekt interpretiert?!
Hm, denke ja aber noch einmal ein Résumé:

Schleife 1 nimmt sich einen Pfad, springt durch pushd in diesen, führt das Suchen nach den angegebenen Typen durch Schleife 2 in sämtlichen Ebenen ab Pfad durch, schreibt die Pfadinformationen der Dateien ins Log, verschiebt diese nach, wieauchimmer - woauchimmer (sollte man sich noch einmal genauer Gedanken machen, wegen evtl. Namensgleichheit), springt wieder aus dem aktuellen Pfad raus, zum Ursprung und geht mit dem nächsten Pfad in Schleife 1 das ganze Theater erneut durch, solange, bis alle Pfade der ersten Schleife abgearbeitet wurden.

greetz André
cyberdevil0815
cyberdevil0815 10.08.2011 um 10:25:29 Uhr
Goto Top
Jepp besten Dank, jetzt schliesst sich langsam der Kreis....habe zwar noch Syntaxfehler, aber die bekomme ich auch noch weg.

Mit den sortieren nach Größe ==> Variable habe ich falsch verstanden. Sortieren war nicht gefordert! Brauch ich auch nicht!

Was aber vergessen wurde, fällt mir im Nachhinein erst auf. Was mach ich bei doppelten Dateinamen? Die werden regeros überschrieben. Das ist natürlich kontraprodutiv, also wäre es wünschens wert, wenn die Ordnerstruktur KOMPLETT kopiert werden würde, und die Datei *test *bak oder was auch immer ausgelesen und verschoben wird. geht sowas auch!?

Da brauch ich dann aber Quellcode ,-) !
bastla
bastla 10.08.2011 um 10:39:37 Uhr
Goto Top
Hallo cyberdevil0815!

Eigentlich sollte ja "robocopy /s /mov" mit Ausgabe des Logs in eine Datei alles sein, was Du brauchst (macht aber weniger Spaß als ein Batch face-wink) ...

Grüße
bastla
cyberdevil0815
cyberdevil0815 10.08.2011 um 13:18:12 Uhr
Goto Top
Robocopy...??? muss ich mich mal zu einlesen...kann ich gerade nix mit anfangen.

Aber zuerst meine erste Lösung zu der Themaik:

@echo
set "Typen=*.abc *.def *.jkl *.ghi"  
set Pfad1=i:\test\
set Pfad2=g:\
set Pfad3=h:\
set Ziel="c:\umlagern\  

dir /b /s %Pfad1% %Typen% >Auswertung.txt

for /f "delims=" %%m in ('dir /s /b %Pfad1% %Typen% ') do move "%%m" %Ziel%  


Folgendes Problem tritt auf.
Beim Move Befehl wird das Gesamte Verzeichnis verschoben, obwohl, so dachte ich zunächst, ich als Auswahlkirterium *.abc , *.def, *.jkl und *.ghi als Dateiendung selektiert habe.
Der Batch verschiebt aber alles, achja und Dateien mit Leerzeichen oder mehr als einem Leerzeichen fasst "er" nicht an.

Pfad 2 und 3 habe ich noch nicht im Code erfasst, funktioniert aber (schon getestet)
Skyemugen
Skyemugen 10.08.2011 um 13:34:15 Uhr
Goto Top
Aloha,

darum habe ich auch pushd verwendet, um im dir-Befehl mit mehreren Typen zu arbeiten, denn sonst sind ihm die Typen sch*piep*furz, denn i.d.R würde man nach:

C:\Pfad\Ordner\*.xyz suchen und daher nur einen Typen angeben können.

In deinem Log dürften auch alle Dateien enthalten sein.

Desweiteren möchte ich dich auf unsere Formatierungshilfe beim posten - Stichwort Code Formatierung hinweisen face-wink

achja und Dateien mit Leerzeichen oder mehr als einem Leerzeichen fasst "er" nicht an.

Kann ich nicht nachvollziehen aber bei der nicht ganz funktionierenden Codezusammenstellung (wie bereits erklärt), eventuell ein Nebeneffekt.

greetz André


P.S.: Mal eine Frage an meine Batchmitstreiter face-wink
Wenn ich mit dieser Codesortierung
for %%s in (%Pfad1%) do (
	pushd "%%s"
	echo %cd%
	popd
)
arbeite, warum bleibt mein %CD% das Ausgangsverzeichnis, wo die batch liegt und nicht das Verzeichnis, in dem gerade gearbeitet wird?
cyberdevil0815
cyberdevil0815 10.08.2011 um 14:11:35 Uhr
Goto Top
Zitat von @Skyemugen:


In deinem Log dürften auch alle Dateien enthalten sein.

> achja und Dateien mit Leerzeichen oder mehr als einem Leerzeichen fasst "er" nicht an.

Kann ich nicht nachvollziehen aber bei der nicht ganz funktionierenden Codezusammenstellung (wie bereits erklärt), eventuell
ein Nebeneffekt.


Ich bin da derzeit ein wenig "blond" und bekomm das nicht so richtig hin, Der Ansatzm behaupte ich, ist da, aber das Feintuning fehlt.

Wenn ich das mit pushd und popd codiere erhalte ich entweder gar nüx oder Syntaxfehler.

Und ja, das Log beinhaltet alle Dateien.

Ich steh voll auf´m Schlauch...*schnief
bastla
bastla 10.08.2011 um 14:25:55 Uhr
Goto Top
@Skyemugen
warum bleibt mein %CD% das Ausgangsverzeichnis
delayedExpansion? face-wink (Genau deswegen mag ich ja auch %errorlevel% nicht ...)

Ersatzweise (wenn ja nur eine Kontrollausgabe erfolgen soll) einfach
cd
verwenden ...

Grüße
bastla
Skyemugen
Skyemugen 10.08.2011 um 14:36:34 Uhr
Goto Top
Aloha,

nun, wieder eingeschränkt nutzbar, sprich Pfade ohne Leerzeichen, meinte ich es so:
for %%s in (%Pfad1% %Pfad2% %Pfad3%) do (
	pushd "%%s"  
	for /f "delims=" %%m in ('dir /b /s %Typen%') do (  
		>>"%LOG%" echo %%m  
		echo move "%%s" "%Ziel%"  
	popd
)

Das move war anfangs auch nur einfach gedacht so wie du es vermutlich vorhattest: Den ganzen Krams in ein Verzeichnis aber da dies imperfekt ist und bei Dateinamengleichheit zum Halleluja führt, muss ich mir da noch etwas überlegen (wenn dann heute Abend, gleich noch Gespräch mit Vodafone Trulla *nerv*), das sinnvoll hinzubekommen.

Unter anderem hatte ich überlegt, die gesamte Struktur per xcopy /T /E /I "%%s" "%Ziel%" erst einmal zu übernehmen, allerdings macht dies das moven nicht einfacher ^_^

greetz André
bastla
bastla 10.08.2011 um 14:37:41 Uhr
Goto Top
Hallo cyberdevil0815!

Vielleicht eher so (ungetestet) - mal nur für ein Startverzeichnis:
@echo on & setlocal
set "Typen=*.abc *.def *.jkl *.ghi"  
set "Quelle=i:\test\"  
::set "Pfad2=g:\" 
::set "Pfad3=h:\" 
set "Ziel=c:\umlagern\"  
set "Log=%Quelle%Auswertung.txt"  
set "Error=%Quelle%Fehler.txt"  

del "%Log%" 2>nul  
del "%Error%" 2>nul  
pushd "%Quelle%"   
dir /b /s %Typen% >>"%Log%"  
popd

for /f "usebackq delims=" %%m in ("%Log%") do set "Quellpfad=%%~m" & call :ProcessFile  
goto :eof

:ProcessFile
call set "Zielpfad=%%Quellpfad%:%Quelle%=%Ziel%%%"  
move "%Quellpfad%" "%Zielpfad%" 2>>"%Error%"  
goto :eof
Grüße
bastla

[Edit] @Skyemugen
... oder gleich je ein "xcopy /s" pro Dateityp (mit mehreren dürfte das nicht gehen), Umleitung der Ausgabe in die Protokoll-Datei und dann das Löschen anhand dieser Datei, oder schneller per "del /s /q" ...
[/Edit]

[Edit2] Schließendes Anführungszeichen in Zeile 6 ergänzt [/Edit2]
Skyemugen
Skyemugen 10.08.2011 um 14:38:08 Uhr
Goto Top
Aloha bastla,

da ich eigentlich %cd% verwenden wollte ... bringt mir cd recht wenig face-wink

DEP ... hm weshalb hier, in anderen Variationen lief es auch ohne und war in der Schleife *grübel*

Hm, dann wohl doch auslagern aber ein ganz funktionierendes, logisch System für's Verschieben habe ich noch nicht, dafür war es gedacht.

greetz André

edit: hm, noch eine Schleife, da lager ich lieber aus per :Ablauf *gg*
bastla
bastla 10.08.2011 um 14:42:26 Uhr
Goto Top
@Skyemugen
da ich eigentlich %cd% verwenden wollte ... bringt mir cd recht wenig face-smile
Nicht so pessimistisch:
for /f "delims=" %%c in ('cd') do echo "%%c"
- allerdings ist mir nicht so ganz klar, was Dir %cd% nützen würde; damit Du zu einem bestimmten Ordner kommen konntest, musste der ja schon bekannt sein (siehe Dein "pushd %%s") ...
Übrigens noch eine Ergänzung zu
C:\Pfad\Ordner\*.xyz suchen und daher nur einen Typen angeben können.
Verwende doch einfach
dir /s /b "C:\Pfad\Ordner\*.abc" "C:\Pfad\Ordner\*.def" "C:\Pfad\Ordner\*.xyz"
Grüße
bastla
Skyemugen
Skyemugen 10.08.2011 um 14:58:03 Uhr
Goto Top
Aloha bastla,

ja kam mir auch schon in den Sinn aber bei 3x Pfad und 4x Typ, das muss nun wahrlich nicht sein.

Das mit cd war nur so ein Nebengedanke, mit dem ich ein wenig rumspielen wollte für's Verschieben "%cd%\%%~nxm" oder so (ohne gleich die gesamte Struktur zu übernehmen) aber ich komme hier heute nicht zum klar Denken face-wink Mal wieder einer dieser belästigten Tage *fg*

greetz André
bastla
bastla 10.08.2011 um 15:23:30 Uhr
Goto Top
... und zum Komplettieren jetzt noch die Variante mit mehreren Quellen (weiterhin ungetestet):
@echo off & setlocal
set "Typen=*.abc *.def *.jkl *.ghi"  
set Quellen="i:\test\" "g:\" "h:\"  
set "Ziel=c:\umlagern\"  
set "Log=Auswertung.txt"  
set "Error=Fehler.txt"  

for %%q in (%Quellen%) do (
    pushd %%q

    dir /b /s %Typen% >>"%Log%"  

    set "Quelle=%%~q"  
    for /f "usebackq delims=" %%m in ("%Log%") do set "Quellpfad=%%~m" & call :ProcessFile  

    popd
)
goto :eof

:ProcessFile
call set "Zielpfad=%%Quellpfad%:%Quelle%=%Ziel%%%"  
if not exist "%Zielpfad%" (  
    move "%Quellpfad%" "%Zielpfad%" 2>>"%Error%"  
) else (
    echo "%Quellpfad%" konnte nicht verschoben werden >>"%Error%"  
)
goto :eof
Zu beachten wäre hier, dass es je Quelle eigene Logdateien ("Auswertung.txt", "Fehler.txt") gibt (werden direkt im Quellverzeichnis abgelegt) und dass bei nur einem gemeinsamen Zielverzeichnis natürlich weiterhin die Gefahr besteht, dass gleichnamige Dateien (soferne auch der unterhalb der Quelle liegende und für das Ziel übernommene Pfad übereinstimmt) vorkommen könnten - in diesem Fall wird eine Meldung in die "Fehler.txt" geschrieben ...

Grüße
bastla

[Edit] Schließendes Anführungszeichen in Zeile 4 ergänzt [/Edit]
Skyemugen
Skyemugen 10.08.2011 um 19:20:03 Uhr
Goto Top
Aloha bastla,

hm, mit der Logdatei arbeiten, eigentlich auch keine dumme Idee ^_^ dank der Vodafone-Tante kam ich heute zu nichts mehr und jetzt will ich auch nicht mehr *lach*

In Zeile 04 würde ich die Anzahl der Zollzeichen, der Sicherheit beim C&P wegen aber auf eine gerade Anzahl zwischen 1 und 3 setzen face-wink
Im Log fließen auch so schön viele Leerzeichen am Ende ein, ob das wirklich gut ist, wenn du dort wieder ausliest?

Aber du hast auch langsam immer mehr Gefallen am call set gefunden oder ist es einfach nur Zufall, dass wir das in letzter Zeit so oft haben *grins*

greetz André
bastla
bastla 10.08.2011 um 19:32:39 Uhr
Goto Top
Hallo Skyemugen!
In Zeile 04 würde ich die Anzahl der Zollzeichen, der Sicherheit beim C&P wegen aber auf eine gerade Anzahl zwischen 1 und 3 setzen face-wink
... wobei es tatsächlich nur für das C&P erforderlich wäre (mach ich aber natürlich trotzdem, und Du könntest cyberdevil0815 auch noch darauf hinweisen - von dem hatte ich's ja schließlich face-wink) ...
Im Log fließen auch so schön viele Leerzeichen am Ende ein
Wie kommst Du auf dieses schmale Brett? face-wink
Aber du hast auch langsam immer mehr Gefallen am call set gefunden oder ist es einfach nur Zufall, dass wir das in letzter Zeit so oft haben *grins*
Dort, wo es möglich und sinnvoll ist, verwende ich das tatsächlich gerne (besonders, weil sich dadurch "delayedExpansion" einsparen lässt) - dass sich in letzter Zeit öfter dazu Gelegenheit bietet, ist mir gar nicht so aufgefallen ...

Grüße
bastla
Skyemugen
Skyemugen 10.08.2011 um 20:04:57 Uhr
Goto Top
Zitat von @bastla:
> Im Log fließen auch so schön viele Leerzeichen am Ende ein
Wie kommst Du auf dieses schmale Brett? face-wink

Aloha bastla,

weiß nicht, muss am Vitaminmangel liegen :D da hat mir doch tatsächlich mein Rechenzentrum wahr machen wollen, dass das Leerzeichen zwischen %Typen% und >> mit ans Ende der Zeile(n) einfließt, was natürlich totaler Unsinn ist aber zu meiner heutigen Fassung passt xD

Ist mal wieder einer dieser Tage face-wink

dass sich in letzter Zeit öfter dazu Gelegenheit bietet, ist mir gar nicht so aufgefallen ...

Kannst du mal sehen, schon betriebsblind *fg*

greetz André
cyberdevil0815
cyberdevil0815 11.08.2011 um 08:37:43 Uhr
Goto Top
Jepp, das sieht doch super aus, ein wenig anders als mein Code, aber hier sitzen die Spezies.

Vielen vielen Dank.

qbastla, auch wenn ungetestet:

Resultat: Dateitypen werden erkannt und gemoved
Logfile wird geschrieben
Errorlog wird geschrieben

Derzeit wird, obwohl als Ziel c:\umlagern angegeben wurde, zwar alles auf dem Desktop ab, aber das ist nur ne Kleinigkeit.

Vielen Dank.

Ich habe das letzte Nacht auf unserem Serversystem laufen lassen, 10 MB Arbeitsspeicher und 3% CPU wurde genutzt (das kann ich verarbeiten und mit umgehen bei 16 GB physikalischen RAM und Quad Core CPU)
Dauer jedoch 1 Stunde bei 1 TB Datenvolumen, welches durchforstet werden musste. Da dies derzeit im Testsystem rennt, wurden hier jedoch mal eben schnell 8 GB an Fehlerprotokollen und Backupdaten gefunden. *yeah das rockt.

Das ganze geht mit Visual Studio und Endapp auf Windowsbasis garantiert effizienter und eleganter, aber für mich reicht dat voll und ganz.

Vielen Dank dafür!
bastla
bastla 11.08.2011 um 11:50:46 Uhr
Goto Top
Hallo cyberdevil0815!
Dauer jedoch 1 Stunde bei 1 TB Datenvolumen
Da jede Datei einzeln "angefasst" wird, überrascht mich die Laufzeit nicht wirklich ...
Hinsichtlich
alles auf dem Desktop
Hast Du das schließende Anführungszeichen in der Zeile 4 nachgetragen?

Grüße
bastla
Skyemugen
Skyemugen 11.08.2011 um 12:01:10 Uhr
Goto Top
Zitat von @bastla:
Hast Du das schließende Anführungszeichen in der Zeile 4 nachgetragen?

Aloha bastla,

stimmt, du hattest mich ja gebeten, ihn auch darauf aufmerksam zu machen, nun, ich hoffte, er würde die weiteren Kommentare lesen und selbst aha rufen *gg*

Außerdem hat er (wohl) c:\umlagern angegeben, während du c:\umlagern\ vorgegeben hast, oder ich interpretiere nur seine Aussage nicht ganz korrekt face-wink

greetz André