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.
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.
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
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
24 Kommentare
Neuester Kommentar
moin,
gruß
- echo on
- set /p
- for
- dir /a-d /s>>
- 7zip
- del
gruß
Aloha,
geht alles Zum Beispiel mit Hilfe dieser Denkanstöße oder auch anders :P
@bastla
Ich denke an einen vordefinierten Netzpfad einfügt dürfte einem
greetz André
geht alles 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é
@Skyemugen
Falls Du mit
etwas in der Art
(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 "
Grüße
bastla
Falls Du mit
move soundso
nach dortunddortmove "D:\Ordner\Unterordner\Unterunterordner\Name.Typ" "\\Server\Share\Ordner\Unterordner\Unterunterordner\Name.Typ"
Da schon so viele Befehle genannt wurden - wie wäre es mit "
xcopy /L
"? "Move" kann übrigens auch "robocopy
" ...Grüße
bastla
Aloha,
WTH!
Schleife 1 nimmt sich einen Pfad, springt durch
greetz André
@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=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.
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 - 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 /?
wechselt in das Verzeichnis und speichert das Ausgangsverzeichnis (sofern er die Variable der Schleife erhält, versteht sich )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 AusgangsverzeichnisHabe 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é
Aloha,
darum habe ich auch
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
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
Wenn ich mit dieser Codesortierung
arbeite, warum bleibt mein
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.
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
Wenn ich mit dieser Codesortierung
for %%s in (%Pfad1%) do (
pushd "%%s"
echo %cd%
popd
)
%CD%
das Ausgangsverzeichnis, wo die batch liegt und nicht das Verzeichnis, in dem gerade gearbeitet wird?
@Skyemugen
Ersatzweise (wenn ja nur eine Kontrollausgabe erfolgen soll) einfach
verwenden ...
Grüße
bastla
warum bleibt mein %CD% das Ausgangsverzeichnis
delayedExpansion? (Genau deswegen mag ich ja auch %errorlevel% nicht ...)Ersatzweise (wenn ja nur eine Kontrollausgabe erfolgen soll) einfach
cd
Grüße
bastla
Aloha,
nun, wieder eingeschränkt nutzbar, sprich Pfade ohne Leerzeichen, meinte ich es so:
Das
Unter anderem hatte ich überlegt, die gesamte Struktur per
greetz André
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é
Hallo cyberdevil0815!
Vielleicht eher so (ungetestet) - mal nur für ein Startverzeichnis:
Grüße
bastla
[Edit] @Skyemugen
... oder gleich je ein "
[/Edit]
[Edit2] Schließendes Anführungszeichen in Zeile 6 ergänzt [/Edit2]
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
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]
Aloha bastla,
da ich eigentlich
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
da ich eigentlich
%cd%
verwenden wollte ... bringt mir cd
recht wenig 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*
@Skyemugen
- 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 "
Übrigens noch eine Ergänzung zu
Grüße
bastla
da ich eigentlich %cd% verwenden wollte ... bringt mir cd recht wenig
Nicht so pessimistisch:for /f "delims=" %%c in ('cd') do echo "%%c"
pushd %%s
") ...Übrigens noch eine Ergänzung zu
C:\Pfad\Ordner\*.xyz suchen und daher nur einen Typen angeben können.
Verwende doch einfachdir /s /b "C:\Pfad\Ordner\*.abc" "C:\Pfad\Ordner\*.def" "C:\Pfad\Ordner\*.xyz"
bastla
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 Mal wieder einer dieser belästigten Tage *fg*
greetz André
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 Mal wieder einer dieser belästigten Tage *fg*
greetz André
... und zum Komplettieren jetzt noch die Variante mit mehreren Quellen (weiterhin ungetestet):
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]
@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
Grüße
bastla
[Edit] Schließendes Anführungszeichen in Zeile 4 ergänzt [/Edit]
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
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
greetz André
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
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é
Hallo Skyemugen!
Grüße
bastla
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
... 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 ) ...Im Log fließen auch so schön viele Leerzeichen am Ende ein
Wie kommst Du auf dieses schmale Brett? Aber du hast auch langsam immer mehr Gefallen am
Dort, wo es möglich und sinnvoll ist, verwende ich das tatsächlich gerne (besonders, weil sich dadurch "call set
gefunden oder ist es einfach nur Zufall, dass wir das in letzter Zeit so oft haben *grins*delayedExpansion
" einsparen lässt) - dass sich in letzter Zeit öfter dazu Gelegenheit bietet, ist mir gar nicht so aufgefallen ...Grüße
bastla
Zitat von @bastla:
> Im Log fließen auch so schön viele Leerzeichen am Ende ein
Wie kommst Du auf dieses schmale Brett?
> Im Log fließen auch so schön viele Leerzeichen am Ende ein
Wie kommst Du auf dieses schmale Brett?
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 xDIst mal wieder einer dieser Tage
dass sich in letzter Zeit öfter dazu Gelegenheit bietet, ist mir gar nicht so aufgefallen ...
Kannst du mal sehen, schon betriebsblind *fg*
greetz André
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 greetz André