DOS Befehl zum Kopieren zahlreicher Dateien ohne die Verzeichnisstruktur?

davegarten  05.05.2023, 13:32

Was für eine Version von DOS? Oder meintest Du den Prompt cmd.exe unter einem modernen Windows?

LDanne 
Fragesteller
 05.05.2023, 13:35

CMD unter Windows 7.

2 Antworten

die Lösung ist eigentlich trivial. Alle .jpg-dateien mit where /r "%QuellOrdner%" "*.jpg" ermitteln und für jeden Fund die Datei einzeln in den Zielordner kopieren

@echo off
set "QuellOrdner=C:\MeineQuelle"
set "ZielOrdner=C:\MeinZiel"
md "%ZielOrdner%" 2>nul &rem erzeugen wenn nicht vorhanden

for /f "tokens=*" %%a in ('where /r "%QuellOrdner%" "*.jpg"') do (
  copy "%%~a" "%ZielOrdner%\%%~nxa"
)
pause

.das hat den Nachteil , das gleichnamige Dateien überschrieben werden.

Wenn gleichnamige Dateien vorhandene nicht überschreiben sollen, in Batch keine simple Aufgabe. Denn Rechnen und und Stringoperationen sind in Batch gruselig.

hier meine Lösung:

MyCopy.cmd

@echo off
set "QuellOrdner=C:\MeineQuelle"
set "ZielOrdner=C:\MeinZiel"
md "%ZielOrdner%" 2>nul  &rem erzeugen  wenn nicht vorhanden


for /f "tokens=*" %%a in ('where /r "%QuellOrdner%" "*.jpg"') do (
    call :copy_the_File "%%~a"
)
pause
exit /b

:copy_the_File 
set "Counter=1"
set "QuellFile=%~1"
set "ZielFile.Full=%ZielOrdner%\%~nx1"
set "ZielFile.Name=%~n1"
set "ZielFile.Extension=%~x1"
  rem  etwas tun damit vorhandene Dateien nicht  überschrieben werden
:addCounter    ändert wenn nötig den  Dateinamen
if exist "%ZielFile.Full%" (
    set /a "Counter+=1"
    call set "ZielFile.Full=%ZielOrdner%\%ZielFile.Name%(%%Counter%%)%ZielFile.Extension%"
    goto :addCounter
)
echo Quelle: "%QuellFile%" 
echo Ziel  : "%ZielFile.Full%"
copy "%QuellFile%" "%ZielFile.Full%"
exit /b
Woher ich das weiß:eigene Erfahrung – Ich mach das seit 30 Jahren

Also falls Du den Command Prompt cmd.exe meintest (und nicht etwa das echte DOS command.com), dann kannst Du das mit "forfiles" machen.

Hier eine Beschreibung des Befehls:

https://learn.microsoft.com/en-us/windows-server/administration/windows-commands/forfiles

forfiles /P C:\StartVerzeichnis /M *.jpg /S /C "cmd /C copy @PATH C:\Zielverzeichnis\"


davegarten  05.05.2023, 13:44

C:\StartVerzeichnis waere das Verzeichnis, welches die vielen Unterverzeichnisse enthält, die die JPGs enthalten. C:\Zielverzeichnis (muss schon existieren!) wäre das Verzeichnis, wo die Jpgs hinkopiert werden sollen. ABER Achtung: Die JPG's dürfen nicht in verschiedenen Unterverzeichnissen unter C:\StartVerzeichnis irgendwo den selben Namen haben, ansonsten wird in C:\Zielverzeichnis die jeweils zuletzt kopierte JPG-Datei eine vorher kopierte Datei mit dem selben Namen überschreiben. Am Besten zählst Du am Schluss, ob die Anzahl der Dateien in C:\StartVerzeichnis und C:\Zielverzeichnis übereinstimmen. Wenn die Anzahl der Dateien in C:\Zielverzeichnis kleiner ist, dann würde ich aufpassen, bevor Du das C:\StartVerzeichnis löschst, sonst verlierst Du Daten.

0
LDanne 
Fragesteller
 06.05.2023, 13:41

Es kommt FEHLER: Das System kann die angegebene Datei nicht finden." Und zwar super oft. Anscheinend für jedes jpg im Zielverzeichnis einmal diese Fehlermeldung, ich zähl die jetzt nicht. Womöglich auch für jedes Unterverzeichnis.

0
LDanne 
Fragesteller
 06.05.2023, 13:44
@LDanne

Obwohl da definitiv jpgs drin sind.

0
LDanne 
Fragesteller
 06.05.2023, 13:47
@LDanne

Das gleiche passiert bei *.* statt *.jpg .

0
LDanne 
Fragesteller
 06.05.2023, 13:53
@LDanne

Sollte das damit zusammen hängen, dass ich unter einem Standard-User-Account ohne Adminrechte arbeite?

0
davegarten  07.05.2023, 00:21
@LDanne

Ich habe noch einen kleinen Fehler gemacht, deshalb lief das mit forfiles nicht. Der Grund ist, dass "copy" kein eigenes Programm mehr ist, sondern eine built-in Funktion von cmd.exe. Und um diese aufrufen zu können , muss man ein "cmd /c" einbauen. D.h. richtig müsste die Commandline so aussehen (habe es oben auch noch korrigiert):

forfiles /P C:\StartVerzeichnis /M *.jpg /S /C "cmd /C copy @PATH C:\Zielverzeichnis\"

0