Top-Themen

Aktuelle Themen (A bis Z)

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 Dateien aus Unterverzeichnissen in einen Ordner verschieben - mit Batch?

Mitglied: obi134

obi134 (Level 1) - Jetzt verbinden

15.10.2009 um 19:03 Uhr, 6965 Aufrufe, 11 Kommentare

Hi ihr Batch- Bastler unter euch
Ich habe leider überhaupt keine Ahnung von Batch- Dateien und bitte somit um eure fachkundige Hilfe!

Ich bin auf der Suche nach einer Batch, die Dateien aus einem Verzeichnis "flach" in einen Ordner packt. Also aus einem Verzeichnis mit mehreren Unterverzeichnissen in einen zentralen Ordner. Ich habe schon

Dateien verschieben und umbenennen mit Batch

gefunden, kann damit aber nicht so viel anfangen. Außerdem habe ich auch

c't - Dateien aus Unterverzeichnissen zusammenführen

gefunden, was die Dateien wohl kopiert, aber nicht verschiebt (Ich hoffe die Links sind sowas wie die gemeinten erlaubten Zusatzverlinkungen, ansonsten ist das nicht böse gemeint).
Bei mir ist das Problem, dass die vielen Bilder teilweise auch gleich heißen und ich nicht ganz nachvollziehen kann, welche er von den über 1000 Dateien kopiert hat und welche ich mit "n" vor dem überschreiben geschützt habe.
Meinetwegen können in dem Zielverzeichnis auch alle "bild1.jpg", "bild2.jpg" usw. heißen.
Die Lösung von Heise, dass man in die Batch in der Eingabeaufforderung mit den entsprechenden Parametern aufrufen kann, finde ich sehr gut und universell. Vielleicht wäre soetwas auch möglich? Eventuell auch noch mit dem Zusatz, wie der Präfix der entsprechenden Zieldateien sein soll z.B. "bild" oder "foto"?

Ich hoffe ich habe mich verständlich ausgedrückt. Ansonsten bitte rückfragen.
Könntet Ihr mir bitte helfen?

Gruß
Tobias
Mitglied: bastla
15.10.2009 um 19:28 Uhr
Hallo obi134 und willkommen im Forum!

Wenn's tatsächlich nur darum geht, alle Bilder (eines bestimmten Dateityps) mit fortlaufender Nummerierung in einem Ordner zu sammeln, könnte das Gerüst etwa so aussehen:
01.
@echo off & setlocal 
02.
set "Sammel=D:\Sammelordner" 
03.
set "Quelle=D:\Quellordner" 
04.
set "Prae=bild" 
05.
set "Typ=jpg" 
06.
 
07.
set /a Nr=1000001 
08.
 
09.
for /r "%Quelle%" %%i in (*.%Typ%) do call :ProcessFile "%%i" 
10.
goto :eof 
11.
 
12.
:ProcessFile 
13.
move %1 "%Sammel%\%Prae%%Nr:~-5%.%Typ%" 
14.
set /a Nr+=1 
15.
goto :eof
Wenn Du eine Parameterübergabe dem Anpassen der Zeilen 2 bis 5 vorziehst, kannst Du diese Zeilen etwa so schreiben:
01.
set "Sammel=%~1" 
02.
set "Quelle=%~2" 
03.
...
Allerdings solltst Du dann eine Prüfung der Parameter auf Vollzähligkeit ergänzen (als Vorlage dafür kann zB das verlinkte c't-Script dienen). Auch Existenz von Quell- und Zielordner wären zu prüfen (bzw letzterer ggf zu erstellen).

Der Inhalt des Zielordners wird ebenfalls vorweg nicht geprüft, sodass also Dateien mit dem selben Präfix (kommentarlos) überschrieben würden ...

Falls die führenden Nullen der laufenden Nummer nicht gewünscht wären, müsstest Du
move %1 "%Sammel%\%Prae%%Nr:~-5%.%Typ%"
durch
move %1 "%Sammel%\%Prae%%Nr%.%Typ%"
ersetzen. (Die Schreibweise mit .%Typ% anstelle von %~x1 hat übrigens den Sinn, eine einheitliche Schreibweise - hinsichtlich Groß-/Kleinschreibung - zu errreichen.)

Grüße
bastla

P.S.:
... welche ich mit "n" vor dem überschreiben geschützt habe.
habe ich nicht verstanden und daher auch nicht berücksichtigt.
Bitte warten ..
Mitglied: obi134
15.10.2009 um 20:04 Uhr
Hi bastla!
Danke für deine superschnelle Antwort!
Ich werde mich morgen, ansonsten nächstes Wochenende mal daran setzen, das Skript zu testen und anzupassen.
Ich werde dann mal das mit der Übergabe ausprobieren und dann die Überprüfung der Parameter, sowie die Prüfung des Zielordners hinzufügen, wenn ich das hinbekomme

mit "n" meinte ich folgendes:
Bei dem Kopieren war eine Datei schon vorhanden. Ich hatte die Option /y weggelassen, um gefragt zu werden (ja/nein/alle) und diese habe ich alle mit n beantwortet, um keine Datei zu überschreiben.
Schönen Abend noch!

Gruß
Tobias

Edit:
Außerdem probiere ich noch das mit den Leerzeichen im Dateinamen zu managen
Bitte warten ..
Mitglied: bastla
15.10.2009 um 20:47 Uhr
Hallo obi134!

Nur zur Sicherheit: Im Entwurf oben wird verschoben und ggf ohne Rückfrage überschrieben - um das zu vermeiden, müsstest Du dem move ein explizites /-Y hinzufügen!
Außerdem probiere ich noch das mit den Leerzeichen im Dateinamen zu managen
Leerzeichen (egal, ob bereits vorhandene oder ev hinzuzufügende) sollten in meinem Vorschlag nicht zu Problemen führen, da alle Dateinamen/Pfade unter Anführungszeichen stehen.

Grüße
bastla
Bitte warten ..
Mitglied: obi134
15.10.2009 um 21:16 Uhr
Hi bastla!
Ich habe mich gerade doch noch etwas an das File gesetzt.
Bin so weit gekommen:

01.
 
02.
@echo off & setlocal 
03.
 
04.
if %2. == . ( 
05.
  echo Nicht genug Parameter.  
06.
  echo Aufruf:   %~n0 ^<Quelle^> ^<Ziel^> [Maske] Präfix 
07.
  echo Beispiel: %~n0 c:\Bilder d:\Backup *.jpg bild 
08.
  echo           Kopiert alle *.jpg-Dateien aus c:\Bilder und Unterordnern "flach" 
09.
  echo           nach d:\Backup. Ist [Maske] nicht angegeben, werden alle Dateien 
10.
  echo           kopiert. Präfix gibt den Datei- Präfix an. 
11.
  exit /b 
12.
13.
 
14.
if %4. == . ( 
15.
  echo Nicht genug Parameter. 
16.
  echo Aufruf:   %~n0 ^<Quelle^> ^<Ziel^> [Maske] Präfix 
17.
  echo Beispiel: %~n0 c:\Bilder d:\Backup *.jpg bild 
18.
  echo           Kopiert alle *.jpg-Dateien aus c:\Bilder und Unterordnern "flach" 
19.
  echo           nach d:\Backup. Ist [Maske] nicht angegeben, werden alle Dateien 
20.
  echo           kopiert. Präfix gibt den Datei- Präfix an. 
21.
  exit /b 
22.
23.
 
24.
set "Quelle=%~1" 
25.
set "Sammel=%~2" 
26.
set "Typ=%3" 
27.
set "Prae=%4" 
28.
set /a Nr=00001 
29.
 
30.
if %Typ%. == . ( 
31.
  set "Typ=*" 
32.
  echo Es werden alle Dateitypen verschoben! 
33.
34.
 
35.
echo Kopiere %Typ% von %Quelle% nach 
36.
     %Sammel% ... 
37.
 
38.
for /r "%Quelle%" %%i in (*.%Typ%) do call :ProcessFile "%%i" 
39.
goto :eof 
40.
 
41.
:ProcessFile 
42.
move /-Y %1 "%Sammel%\%Prae%%Nr:~-5%.%Typ%" 
43.
set /a Nr+=1 
44.
goto :eof 
45.
 
46.
dir /s "%Quelle%\%Typ%" > %~n0.log 
47.
 
Ich hoffe, dass ich trotz meiner sehr großen Unwissendheit über Batch und Co alles bis jetzt korrekt kopiert und angepasst habe
Es fehlt dann noch die Abfrage des Zielordners und evtl. eine Abfrage, wie hoch der Zähler bei den bereits vorhandenen Dateien ist (wenn das überhaupt geht

Schönen Abend noch!
Gruß
Tobias
Bitte warten ..
Mitglied: bastla
15.10.2009 um 21:33 Uhr
Hallo obi134!

Da Du ja zumindest 3 Parameter brauchst, wäre
if %3. == . ( 
zu verwenden, und der optionale Parameter "Maske" als Letzter einzugeben (und zwar ohne "*" und ohne Punkt).
In der Zeile 28 fehlt die "1" am Anfang - richtig wäre:
set /a Nr=100001
Zahlen werden ohne führenden Nullen gespeichert, sodass Du diese Nullen nur erhältst, indem Du eine größere Zahl verwendest und die entsprechende Stellenanzahl (im Beispiel waren es 5) am Ende der Zahl entnimmst (siehe auch unten).
... eine Abfrage, wie hoch der Zähler bei den bereits vorhandenen Dateien ist (wenn das überhaupt geht
Ließe sich etwa so (als Ersatz der Zeile 28) realisieren:
01.
set "Letzte=00000" 
02.
for /f %%i in ('dir /b /on "%Sammel%\%Prae%*.%Typ%" 2^>nul') do set "Letzte=%%~ni" 
03.
set /a Nr=1%Letzte:~-5%+1
Damit werden die entsprechenden Dateinamen (wegen der fixen Länge der laufenden Nummer auch richtig) sortiert durchlaufen und als Zwischenergebnis in der Variablen %Letzte% für den Namen mit der höchsten Nummer nur der Dateiname (also zB ohne ".jpg") gespeichert - dessen letzte 5 Stellen werden an 1 angefügt, woraus sich zB 100012 ergibt und dieses Ergebnis gleich noch um 1 erhöht, um aus dem Ergebnis (zB 100013) wiederum die letzten 5 Stellen (dann also 00013) als nächste Nummer verwenden zu können.
Abfrage des Zielordners zB so:
if not exist "%Sammel%" md "%Sammel%"
Deine Zeile 46 wird nie erreicht, da der Batch mit Zeile 39 endet - daher zwischen die Zeilen 38 und 39 einfügen - außerdem enthält ja %Typ% weder "*" noch ".", daher: "%Quelle%\*.%Typ%" verwenden ...

Grüße
bastla
Bitte warten ..
Mitglied: obi134
16.10.2009 um 14:02 Uhr
Hey bastla du hast es voll drauf ^^
Der Code sieht nun so aus:

01.
@echo off & setlocal 
02.
 
03.
if %3. == . ( 
04.
  echo Nicht genug Parameter. 
05.
  echo Aufruf:   %~n0 ^<Quelle^> ^<Ziel^> Präfix [Maske]  
06.
  echo Beispiel: %~n0 c:\Bilder d:\Backup jpg bild 
07.
  echo           Kopiert alle *.jpg-Dateien aus c:\Bilder und Unterordnern "flach" 
08.
  echo           nach d:\Backup. Präfix gibt den Datei- Präfix an.Ist [Maske]  
09.
  echo           nicht angegeben, werden alle Dateien kopiert.  
10.
  exit /b 
11.
12.
 
13.
set "Quelle=%~1" 
14.
set "Sammel=%~2" 
15.
set "Prae=%3" 
16.
set "Typ=%4" 
17.
set "Letzte=00000" 
18.
 
19.
if not exist "%Sammel%" md "%Sammel%" 
20.
 
21.
for /f %%i in ('dir /b /on "%Sammel%\%Prae%*.%Typ%" 2^>nul') do set "Letzte=%%~ni" 
22.
set /a Nr=1%Letzte:~-5%+1 
23.
 
24.
echo Nächste Dateinummer ist %Letzte% 
25.
 
26.
if %Typ%. == . ( 
27.
  set "Typ=*" 
28.
  echo Es werden alle Dateitypen verschoben! 
29.
30.
 
31.
echo Kopiere %Typ% von %Quelle% nach 
32.
     %Sammel% ... 
33.
 
34.
for /r "%Quelle%" %%i in (*.%Typ%) do call :ProcessFile "%%i" 
35.
dir /s "%Quelle%\*.%Typ%" > %~n0.log 
36.
goto :eof 
37.
 
38.
:ProcessFile 
39.
move /-Y %1 "%Sammel%\%Prae%%Nr:~-5%.%Typ%" 
40.
set /a Nr+=1 
41.
goto :eof
Kann man nach Zeile 32 noch eine Bestätigung einbauen, sodass man noch abbrechen kann, falls was nicht passt?
z.B. Fortfahren? (ja/nein)

Gruß
Tobias
Bitte warten ..
Mitglied: bastla
16.10.2009 um 14:43 Uhr
Hallo obi134!

Etwa so:
01.
set "Eingabe=" 
02.
set /p Eingabe=Fortfahren? (ja/nein)  
03.
if /i "%Eingabe:~0,1%" neq "j" goto :eof
Grüße
bastla
Bitte warten ..
Mitglied: obi134
16.10.2009 um 14:56 Uhr
Okay, habe jetzt

01.
@echo off & setlocal 
02.
 
03.
if %3. == . ( 
04.
  echo Nicht genug Parameter. 
05.
  echo Aufruf:   %~n0 ^<Quelle^> ^<Ziel^> Praefix [Maske]  
06.
  echo Beispiel: %~n0 c:\Bilder d:\Backup jpg bild 
07.
  echo           Kopiert alle *.jpg-Dateien aus c:\Bilder und Unterordnern "flach" 
08.
  echo           nach d:\Backup. Praefix gibt den Datei- Praefix an.Ist [Maske]  
09.
  echo           nicht angegeben, werden alle Dateien kopiert.  
10.
  exit /b 
11.
12.
 
13.
set "Quelle=%~1" 
14.
set "Sammel=%~2" 
15.
set "Prae=%3" 
16.
set "Typ=%4" 
17.
set "Letzte=00000" 
18.
 
19.
if not exist "%Sammel%" md "%Sammel%" 
20.
 
21.
for /f %%i in ('dir /b /on "%Sammel%\%Prae%*.%Typ%" 2^>nul') do set "Letzte=%%~ni" 
22.
set /a Nr=1%Letzte:~-5%+1 
23.
 
24.
echo Nächste Dateinummer ist %Letzte% 
25.
 
26.
if %Typ%. == . ( 
27.
  set "Typ=*" 
28.
  echo Es werden alle Dateitypen verschoben! 
29.
30.
 
31.
echo Kopiere %Typ% von %Quelle% nach 
32.
     %Sammel% ... 
33.
 
34.
set /p Eingabe=Fortfahren? (ja/nein)  
35.
if /i "%Eingabe:~0,1%" neq "j" goto :eof 
36.
 
37.
for /r "%Quelle%" %%i in (*.%Typ%) do call :ProcessFile "%%i" 
38.
dir /s "%Quelle%\*.%Typ%" > %~n0.log 
39.
goto :eof 
40.
 
41.
:ProcessFile 
42.
move /-Y %1 "%Sammel%\%Prae%%Nr:~-5%.%Typ%" 
43.
set /a Nr+=1 
44.
goto :eof
Dann kommt folgendes:

C:\>flatmove "C:\Dokumente und Einstellungen\Obi\Desktop\test" "C:\Dokumente und
Einstellungen\Obi\Desktop\test12" text txt
Nõchste Dateinummer ist 00000
Kopiere txt von C:\Dokumente und Einstellungen\Obi\Desktop\test nach
Der Befehl "C:\Dokumente" ist entweder falsch geschrieben oder
konnte nicht gefunden werden.
Fortfahren? (ja/nein) j
Datei nicht gefunden

was ist da noch falsch?
Danke!
Gruß
Tobias
Bitte warten ..
Mitglied: bastla
16.10.2009 um 15:11 Uhr
Hallo obi134!

Entweder die Zeilenschaltung am Ende der Zeile 31 entfernen oder ein "echo" an den Anfang der Zeile 32 setzen ...

Noch ein Hinweis: Zum Testen in Zeile 1 "echo on" anstelle von "echo off" verwenden - so wird jeder Befehl vor der Ausführung angezeigt und Du kannst Fehler leichter erkennen (besonders, wenn Du mit
flatmove "C:\Dokumente und Einstellungen\Obi\Desktop\test" "C:\Dokumente und 
Einstellungen\Obi\Desktop\test12" text txt >Ablauf.txt 2>&1
alle Ausgaben (auch jene auf dem Fehlerkanal 2) in eine Datei umleitest (die Eingabe der Bestätigung musst Du allerdings in diesem Fall "blind" machen).
Ansonsten wären noch "Textmängel" anzumerken : "Nächste" anstelle von "Letzte" Dateinummer (oder eben die Ausgabe von %Nr%) und "Kopiere" anstelle von "Verschiebe" ...

Grüße
bastla
Bitte warten ..
Mitglied: obi134
23.10.2009 um 11:22 Uhr
Da ich im Moment etwas krank bin dauert es noch etwas, bis ich das Skript mal austesten kann...
Ich melde mich dann mal, wenn ich es getestet habe.
Gruß
Tobias
Bitte warten ..
Mitglied: obi134
01.11.2009 um 13:55 Uhr
Klappt wunderbar!
Danke nochmal!
Gruß
Tobias
Bitte warten ..
Ähnliche Inhalte
Batch & Shell

Bestimmte Dateien aus Unterverzeichnissen verschieben und restliche Ordner und Dateien löschen

Frage von evolutionBatch & Shell33 Kommentare

Hallo, ist es möglich per Batch oder PowerShell bestimmte Inhalte (Dateien) aus Ordnern in eine darunterliegende Ebene zu verschieben? ...

Batch & Shell

Batch Ordner erstellen und verschieben

gelöst Frage von FromeonlyBatch & Shell6 Kommentare

Hallo Leute, ich habe ein kleines Problem beim erstellen einer Batch. Ziel der Batch soll es sein, dass sie ...

Batch & Shell

Ordner per Batch verschieben, Datei kopieren

gelöst Frage von Shape.ShifterBatch & Shell2 Kommentare

Guten Abend :) Ich möchte mein Backup etwas anpassen und muss dafür viele Ordner verschieben und jeweils eine Datei ...

Batch & Shell

Batch: bestimmte Datei finden und den Ordner verschieben

gelöst Frage von Gari.onBatch & Shell9 Kommentare

Hallo! ich hoffe ich bin hier richtig, es geht um folgendes Problem: in einem Ordner liegen mehrere Unterordner mit ...

Neue Wissensbeiträge
Windows 10

USB Maus und Tastatur versagen Dienst unter Windows 10

Erfahrungsbericht von hardykopff vor 9 StundenWindows 103 Kommentare

Da steht man ziemlich dumm da, wenn der PC sich wegen fehlender USB Tastatur und Maus nicht bedienen lässt. ...

Administrator.de Feedback
Update der Seite: Alles zentriert
Information von Frank vor 12 StundenAdministrator.de Feedback10 Kommentare

Hallo User, die größte Änderung von Release 5.8 ist das Zentrieren der Webseite (auf großen Bildschirmen) und ein "Welcome"-Teaser ...

Humor (lol)

WhatsApp-Nachrichten endlich auch per Bluetooth versendbar

Information von BassFishFox vor 1 TagHumor (lol)4 Kommentare

Genau darauf habe ich gewartet! ;-) Der beliebte Messaging-Dienst WhatsApp erhält eine praktische neue Funktion: Ab dem nächsten Update ...

Google Android

Googles "Android Enterprise Recommended" für Unternehmen

Information von kgborn vor 1 TagGoogle Android3 Kommentare

Hier eine Information, die für Administratoren und Verantwortliche in Unternehmen, die für die Beschaffung und das Rollout von Android-Geräten ...

Heiß diskutierte Inhalte
Server-Hardware
Welche Rolle spielt Design bei Enterprise IT Hardware?
Frage von ApolloXServer-Hardware17 Kommentare

Ich arbeite für einen internationalen Elektronikhersteller in der Forschung und meine Aufgabe ist es, Feedback von Nutzern in Hinsicht ...

Windows Netzwerk
WSUS4 und Windows 10 Updates automatisch installieren
Frage von sammy65Windows Netzwerk15 Kommentare

Hallo miteinander, ich habe mit einen neuen WSUS Server aufgesetzt Server 2016 darauf einen aktuellen WSUS. Grund, wir stellen ...

Speicherkarten
Vergessliche USB-Sticks?
Frage von hanheikSpeicherkarten14 Kommentare

Ich habe in den letzten Tagen 500 USB-Sticks mit Bilddateien bespielt. Obwohl ich die Dateien mit größter Sorgfalt kopiert ...

Switche und Hubs
Cisco SG350X-48 AdminIP in anderes VLAN
Frage von lcer00Switche und Hubs14 Kommentare

Hallo zusammen, ich habe ein Problem mir einem Cisco SG350X-48 bei der Erstinstallation wurde eine IP 192.168.0.254 (Default VLAN ...