Dateien kopieren, rekursiv in einen Ordner, Dubletten durchnummerieren.

orlet
auf die Gefahr hin, daß mich der Biber gleich anknappert:

Ich weis, kopieren und umbenennen ist schon oft behandelt, aber ich bekomme die Mischung nicht hin.

Erreichen möchte ich, das alle Files aus beliebig tiefen Unterverzeichnisse von %parent% in ein %target% kopiert werden. Dubletten sollen dabei nicht überschrieben, sondern durchnummeriert werden. Die Baumstruktur von %parent% soll aufgelöst werden (keine SubDirs in %target%

Ich habe folgende Skripte versucht zu kombinieren:
::-----Inhalt ftpcopy.bat
::--- MoveAll2OneDir.bat (ungetestete Skizze)

Mein Versuch:
:: --- MoveAll2OneDir.bat (ungetestete Skizze)
:: @echo off & setlocal
Set parent=s:\test\
Set target=s:\target\
Pushd "%parent%" && Rem In das parent Verzeichnis wechseln
for /F %%i in ('dir /a:D /b') do (
for /F %%a in ('dir /b /A:-d %%i\*.*') do (
if exist %target%%%a (
if exist %target%%%a-4 (echo "Worst-Case war nicht worst genug!") && pause
if exist %target%%%a-4 goto end
if exist %target%%%a-3 rename %Target%%%a-3 %%a-4
if exist %target%%%a-2 rename %Target%%%a-2 %%a-3
if exist %target%%%a-1 rename %Target%%%a-1 %%a-2
rename %target%%%a %%a-1
)
copy %parent%%i%%a% %target%%a% >nul
)
)

::del %inputdir%%filename%
Popd && rem ..und alten Zustand von Lw/Verz wiederherstellen... ist eine Stilfrage
::--- MoveAll2OneDir.bat

scheitert daran, daß der copy-Befehl irgendwie nicht richtig ist:
Datei nicht gefunden
S:\test>copy s:\test\ s:\target\ 1>nul
Das System kann die angegebene Datei nicht finden.

Irgendwie schaut %%a aber doch gefüllt zu werden, irgendwo im Output steckt ein
S:\test>(if exist s:\emese_target\install.txt ( ...

Nun bin ich in Batch-Proggen absoluter Neuling, mir geht es eigentlich nur um mein Kopier-Problem. Vor allem die Variablen-Deklarierung versteh ich gar nicht. Vielleicht erbarmt sich jemand und richtet mal mein Skript. Und vielleicht bekommt er die Nummerierung auch an den Dateinamen, und nicht an den File-Typ.

Danke

Content-Key: 33259

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

Ausgedruckt am: 18.01.2022 um 21:01 Uhr

Mitglied: orlet
orlet 30.05.2006 um 20:09:32 Uhr
Goto Top
mein jetziger Stand:
:: --- MoveAll2OneDir.bat (ungetestete Skizze)
@echo off & setlocal

Set source=s:\emese
Set target=s:\target

Pushd "%source%" && Rem In das Source-Verzeichnis wechseln

echo versuche erste for
FOR /F %%i IN ('dir /A:D /b /s') DO (
for /F %%a in ('dir /b /A:-d %%i\*.*') do (
if exist %target%\%%a (

if exist %target%\%%a-9 (echo "Worst-Case war nicht worst genug!") && pause
if exist %target%\%%a-9 goto end

if exist %target%\%%a-8 rename %target%\%%a-9 %%a-9
if exist %target%\%%a-7 rename %target%\%%a-7 %%a-8
if exist %target%\%%a-6 rename %target%\%%a-6 %%a-7
if exist %target%\%%a-5 rename %target%\%%a-5 %%a-6
if exist %target%\%%a-4 rename %target%\%%a-4 %%a-5
if exist %target%\%%a-3 rename %target%\%%a-3 %%a-4
if exist %target%\%%a-2 rename %target%\%%a-2 %%a-3
if exist %target%\%%a-1 rename %target%\%%a-1 %%a-2
if exist %target%\%%a-0 rename %target%\%%a-0 %%a-1
rename %target%\%%a %%a-0
)
echo copy %%i\%%a %target%\%%a
copy %%i\%%a %target%\%%a
)
)



::del %inputdir%%filename%
Popd && rem ..und alten Zustand von Lw/Verz wiederherstellen... ist eine Stilfrage
::--- MoveAll2OneDir.bat

:end


Bleibt noch das Prob, das der index hinter der Dateiendung steht, und nicht beim Namen. Meine Experimente mit find; findstr; usw. bringen mich irgendwie nicht weiter.
Mitglied: Biber
Biber 31.05.2006 um 21:58:23 Uhr
Goto Top
Moin orlet,

da will ich mal ein bisschen ausweichend antworten...

Die beiden Schnipsel, die Du zusammengeschraubt hast, lassen sich zwar zum Fliegen bringen, aber der Batch hat ja gleich drei Designfehler.

1) Weder Datei- noch Verzeichnisnamen mit Leerzeichen ( "C:\Dokumente und Einstellungen"..) werden verarbeitet.
War damals nicht gefordert, aber für einen allgemein verwendbaren Batch muss das rein.
2) Der ist, wie mir Dein Kommentar gezeigt hat, nicht pfleg- und wartbar. Und bei Bätchen ist es immer irgendwann so, dass die angepasst/erweitert/ergänzt werden müssen. Da helfen dann dünn kommentierte Zeilen mit einem halben Dutzend %%a's und %%o's wenig.
3) Die Behandlung der Dateinamens-Kollisionen sollte nicht so fest verdrahtet werden. Ob der Worst-Case nun auf 4 oder auf 8 oder auf 20 gesetzt wird... es wird immer zu kurz greifen. Also sollte das Umbenennen IMMER funktionieren, auch wenn Du 500 Verzeichnisse mit Shareware in einen Ordner kopierst und dort Hunderte Dateien "ReadMe.txt" oder "File.diz" dabei sind.

Ich habe mal eine Skizze gemacht für das Durchwackeln der Quell-Unterverzeichnisse. Ist nur Demo (Kopiert nicht, sondern bringt Bildschirmmeldungen, was er gerade tun WÜRDE).
Das Dateinamen-Kollisionsproblem/die Umbenennerei machen wir später.
Mimik: Das Quellverzeichnis wird von der Wurzel an Unterverteichnis für Unterverzeichnis einzeln "betreten" mit "PushD". Und hinterher wieder mit PopD auf das vorher gültige Verzeichnis zurückgegangen. Dadurch braucht nicht mehr beim Kopieren der ganze Quellpfad angegeben werden.

Mit der Skizze kannst Du erstmal loslaufen... die zeigt vor allem die Auflösung der %~d/ %~p/ %~n /%~x-Variablen.

Mit diesem Wissen kannst Du jede Datei, die irgendwo durch eine For..In..Do-Anweisung durchgeschleift wird, in ihre Pfad/Namens/Extension-Bestandteile aufspalten.

Im Moment ist in dem obigen Schnipsel folgende Demo-Sequenz in der inneren FOR-Schleife:
  • Anmerkung: die Carets ^ vor den Klammern sind nur zur Maskierung für den Echo-Befehl da. Einfach ignorieren.
Scharf gemacht und um einen ELSE-Zweig ergänzt sähe das so aus:

Und diese Zeile erläutere ich:
For /L %%i in (%MaxDups%,-1,1) do if not exist "%target%\%~n1-%%i%%~x1" set "newname=%target%\%~n1-%%i%%~x1"

For /L %%i in (%MaxDups%,-1,1) do ----------> Von MaxDups an in Einserschritten runterzählen ....44, 43, 42...etc steht in der Variablen %%i

... if not exist "%target%\%~n1-%%i%%~x1"
..wenn nicht folgende Datei existiert...
%target%\ = s:\emese\
%~n1 ......= vom 1.Parameter (dateiname) nur den Namen OHNE Extension beachten == "ReadMe" bei "ReadMe.txt"
-%%i .........= wird zu "-44", "-43", "-42" etc
%%~x1 ........= vom 1.Parameter (dateiname) nur die Extension z.B ".txt"
.... wenn diese Datei S:\emese\readme-44.txt nicht existiert (der Name FREI ist)
...dann merken wir uns den.
set "newname=%target%\%~n1-%%i%%~xi"

Soweit die Skizze... ich denke, die Anpassungen bekommst Du jetzt hin.

Gruß
Biber
Mitglied: orlet
orlet 01.06.2006 um 12:50:40 Uhr
Goto Top
Tausend Dank, auch und insbesondere für die Erläuterung. Ich glaube ich habe es sogar halbwegs verstanden. Gerade dieses %~fdpnxsatza hat mir anfänglich totales Kopfzerbrechen bereitet

(Für Leidensgenossen: Das letzte a ist die eigentliche Variable, alles davor steuert die Formatierung von a; siehe "for /?" am Promt).

Soweit die Skizze... ich denke, die
Anpassungen bekommst Du jetzt hin.

Gruß
Biber

Welche Anpassungen? Ah jetzt, Du wolltest mich testen:
set "newname=%target%\%~n1-%%i%%~xi"
muss doch wohl heißen
set "newname=%target%\%~n1-%%i%%~x1"

Nochmals danke
Orest
Mitglied: Biber
Biber 01.06.2006 um 13:01:28 Uhr
Goto Top
;-) face-wink Nein, das %%~xi statt %%~x1 war ein ganz normaler Tippfehler...
Mit Anpassungen meinte ich, ob Du Du nun ein COPY und danach DEL machst oder ein MOVE oder irgendwas in eine LogDatei schreibst etc...

Aber ich denke, die eigentliche Frage ist beantwortet - ich setze den beitrag mal auf "Gelöst".

Grüße
Biber
Heiß diskutierte Beiträge
question
Windows Exchange-Server benötige ich eine Domain?Bella21Vor 1 TagFrageWindows Server21 Kommentare

Hallo alle zusammen, ich bin neu auf dem Gebiet. Ich habe Exchange Server auf einen Windows Server 2012 installiert. Nach der Installation fertig war, ist ...

question
WEBSEITE zerschossen. Brauche dringend hilfe! :) gelöst wieoderwasVor 1 TagFrageWebentwicklung5 Kommentare

Hallo zusammen, ich wollte eben auf der Typo3 Seite von unseren Unternehmen die Erweiterung der IT Kanzlei installieren. Nun erhalte ich beim Webseiten aufruf folgenden ...

question
Scanner Log4JjoergVor 1 TagFrageSicherheits-Tools15 Kommentare

Hallo zusammen, Log4J ist ja mittlerweile schon ein paar Tage her aber immer noch aktuell. Ich bin aktuell auf der Suche nach einem Scanner der ...

question
Welcher Switch Hersteller kann trotz Silikonknappheit ordentlich liefern?NordicMikeVor 1 TagFrageSwitche und Hubs7 Kommentare

Moin zusammen, dieses Ubiquiti Zeug muss weg, das kann ja nicht einmal QoS, auch, wenn der Unifi Controller mit seiner zentralen Verwaltung gut zu bedienen ...

question
DNS neu einrichtensmschmidtVor 1 TagFrageDNS14 Kommentare

Hallo zusammen, hab wieder ein Problem: Hab einen neuen Windows Server 2022 (Server3) in unsere Domain aufgenommen, zum DC gemacht und DHCP und DNS installiert. ...

question
Telefonie noch im alten Standort erneuern?GrinskeksVor 1 TagFrageTK-Netze & Geräte7 Kommentare

Hallo zusammen, bei meinem neuen Arbeitgeber steht der Umzug in ein neues Firmengebäude und eine Aktualisierung der Telekommunikation an. Wir hatten einen Support zur betagten ...

question
Eigene Hardware + VLAN an Vodafone Kabel gelöst darkness08Vor 1 TagFrageInternet12 Kommentare

Guten Morgen Zusammen, ich möchte gerne an einen Vodafone Kabelanschluss eigene Hardware betreiben. Da es sich hierbei nicht um meinen eigenen Anschluss handelt fehlt mir ...

question
Reverse Proxy über 2 netzwerkegiorgio123Vor 1 TagFrageNetzwerke13 Kommentare

Hallo Zusammen Ich habe einen Problem und komme alleine nicht weiter Ich habe einen Revers Proxy im NAT-Bereich der Firewall2. Nun muss dieser Reverseproxy muss ...