Batch Script zum Verschieben von Dateien mit bestimmten Namen erstellen - Anfang der Dateinamen mit Ordnernamen vergleichen (Leerzeichen, Sonderzeichen, unterschiedliche Dateinamenlänge)
Hallo,
ich benötige dringend eure Hife bei der Lösung eines Problems. Meine eigenen Versuche verliefen leider größtenteils erfolglos. Ich konnte zwar ein Scipt erstellen, aber es funktioniert nur, wenn die Dateinamen und der Name vom Zielordner 100% übereinstimmen und nicht wie gewünscht, wenn der Dateiname nur mit dem Ordnernamen beginnen.
Ich habe versucht eine Batchdatei (s.u.) zu erstellen, die Dateien aus einem Quellordner in verschiedene Zielordner auf unterschiedlichen Festplatten nach bestimmten Kriterien sortieren und verschieben soll. Am einfachsten kann man es mit den Filterregeln eines Mailprogamms vergleichen.
Alle Dateien eines Ordners sollen in die jeweils zur Datei gehörenden Ordner auf verschiedenen Festplatten verschoben werden. Die Dateinamen beginnen jeweils mit dem Namen des Zielordners und dann folgen völlig willkürliche alphanummerische Zeichen mit immer unterschiedlichen Längen. Die Namen der Zielordner enthalten Umlaute, Leerzeichen und Sonderzeichen und sie sind immer länger als 1 Zeichen.
In den Zielordnern können bereits Dateien mit dem gleichen Namen vorhanden sein. Wenn das der Fall ist, soll die Datei nicht in den eigentlichen Zielordner, sondern in den Ordner "Bearbeiten" im Rootverzeichnis des Quellordners veschoben werden, zur späteren manuellen Bearbeitung. Auf den Festplatten mit den Zielordnern sind Ordner, deren Name nur aus 1 Buchstaben besteht. Diese "Register"-Verzeichnisse dienen nur der Unterteilung der Ordner und sind keine Zielordner.
Nachdem meine eigenen Bemühungen und auch meine Suche im Internet und diesem Forum leider erfolglos waren, habe ich versucht, das Script in einzelne Aufgaben aufzubrechen.
1. Ein Script zur Ermittlung der Verzeichnisnamen
Ich habe ein Script erstellt, welches alle Namen der Unterordner (Zielordner) einer Festplatte in eine Logdatei schreibt.
Das Erstellen der Logdatei funktioniert, zumindest für 1 Festplatte. Leider enthält sie auch die "Register"-Ordern. Die krieg ich da nicht raus. Ich weiß nicht, wie. Hatte nach einem Befehl gesucht, der nur Ordnernamen mit mindestens 2 Zeichen Länge in die Logdatei schreibt. Im Internet steht, für die Ermittlung der Ordnernamenlänge wird ein eigenes, sehr aufwändiges Script dafür benötigt. Das war für mich zu kompliziert und den Aufwand nicht wert.
2. Vergleiche Dateinamen mit Ordnernamen aus Logdatei
Dann wollte ich mithilfe einer For-Schleife die Dateinamen mit den Name aus der Logdatei vergleichen. Zeile für Zeile. Bei Gleichheit soll die Datei in den Zielordner verschoben werden.
Ich habe es geschafft ein Script (s.u.) zu schreiben, welches die Ordnernamen aus der Logdatei mit den Dateinamen aus dem Quellordner vergleicht und bei Gleichheit die Dateien in die jeweiligen Zielordner mit gleichem Namen verschiebt. Soweit, so gut.
Mein eigentliches Problem ist jetzt, die Dateinamen sind nicht 100% identisch mit den Ordnernamen, sondern sie beginnen nur mit dem Ordnernamen!! Und genau dafür finde ich kein Script! Ich bekomme es einfach nicht hin!
Ich stelle das einmal zur besseren Verdeutlichung grafisch da.
Vorher:
c:\Test\Bearbeiten\
c:\Test\verzeichnis1
474 - Ü l452.txt
titel 1_543236.txt
titel#4 rh323.txt
titel7.txt
c:\Test\verzeichnis-xyz\
c:\Test\verzeichnis-xyz\0-1\
c:\Test\verzeichnis-xyz\474 - Ü\
c:\Test\verzeichnis-xyz\A\
c:\Test\verzeichnis-xyz\B\
c:\Test\verzeichnis-xyz\C\
...
c:\Test\verzeichnis-xyz\T\
c:\Test\verzeichnis-xyz\titel 1_54\
c:\Test\verzeichnis-xyz\titel#4 r\
c:\Test\verzeichnis-xyz\titel2\
c:\Test\verzeichnis-xyz\U\
...
Nach dem Sortieren:
c:\Bearbeiten\
titel7.txt
c:\Test\verzeichnis1\
c:\Test\verzeichnis-xyz\
c:\Test\verzeichnis-xyz\0-1\
c:\Test\verzeichnis-xyz\474 - Ü\
474 - Ü l452.txt
c:\Test\verzeichnis-xyz\A\
c:\Test\verzeichnis-xyz\B\
c:\Test\verzeichnis-xyz\C\
...
c:\Test\verzeichnis-xyz\T\
c:\Test\verzeichnis-xyz\titel 1_54\
titel 1_543236.txt
c:\Test\verzeichnis-xyz\titel#4 r\
titel#4 rh323.txt
c:\Test\verzeichnis-xyz\U\
...
Hier mein Script:
Kann mir bitte einer von den erfahrenen Profis hier bei meinem Problem helfen?
Danke!
Gruß,
Sully16
ich benötige dringend eure Hife bei der Lösung eines Problems. Meine eigenen Versuche verliefen leider größtenteils erfolglos. Ich konnte zwar ein Scipt erstellen, aber es funktioniert nur, wenn die Dateinamen und der Name vom Zielordner 100% übereinstimmen und nicht wie gewünscht, wenn der Dateiname nur mit dem Ordnernamen beginnen.
Ich habe versucht eine Batchdatei (s.u.) zu erstellen, die Dateien aus einem Quellordner in verschiedene Zielordner auf unterschiedlichen Festplatten nach bestimmten Kriterien sortieren und verschieben soll. Am einfachsten kann man es mit den Filterregeln eines Mailprogamms vergleichen.
Alle Dateien eines Ordners sollen in die jeweils zur Datei gehörenden Ordner auf verschiedenen Festplatten verschoben werden. Die Dateinamen beginnen jeweils mit dem Namen des Zielordners und dann folgen völlig willkürliche alphanummerische Zeichen mit immer unterschiedlichen Längen. Die Namen der Zielordner enthalten Umlaute, Leerzeichen und Sonderzeichen und sie sind immer länger als 1 Zeichen.
In den Zielordnern können bereits Dateien mit dem gleichen Namen vorhanden sein. Wenn das der Fall ist, soll die Datei nicht in den eigentlichen Zielordner, sondern in den Ordner "Bearbeiten" im Rootverzeichnis des Quellordners veschoben werden, zur späteren manuellen Bearbeitung. Auf den Festplatten mit den Zielordnern sind Ordner, deren Name nur aus 1 Buchstaben besteht. Diese "Register"-Verzeichnisse dienen nur der Unterteilung der Ordner und sind keine Zielordner.
Nachdem meine eigenen Bemühungen und auch meine Suche im Internet und diesem Forum leider erfolglos waren, habe ich versucht, das Script in einzelne Aufgaben aufzubrechen.
1. Ein Script zur Ermittlung der Verzeichnisnamen
Ich habe ein Script erstellt, welches alle Namen der Unterordner (Zielordner) einer Festplatte in eine Logdatei schreibt.
Das Erstellen der Logdatei funktioniert, zumindest für 1 Festplatte. Leider enthält sie auch die "Register"-Ordern. Die krieg ich da nicht raus. Ich weiß nicht, wie. Hatte nach einem Befehl gesucht, der nur Ordnernamen mit mindestens 2 Zeichen Länge in die Logdatei schreibt. Im Internet steht, für die Ermittlung der Ordnernamenlänge wird ein eigenes, sehr aufwändiges Script dafür benötigt. Das war für mich zu kompliziert und den Aufwand nicht wert.
2. Vergleiche Dateinamen mit Ordnernamen aus Logdatei
Dann wollte ich mithilfe einer For-Schleife die Dateinamen mit den Name aus der Logdatei vergleichen. Zeile für Zeile. Bei Gleichheit soll die Datei in den Zielordner verschoben werden.
Ich habe es geschafft ein Script (s.u.) zu schreiben, welches die Ordnernamen aus der Logdatei mit den Dateinamen aus dem Quellordner vergleicht und bei Gleichheit die Dateien in die jeweiligen Zielordner mit gleichem Namen verschiebt. Soweit, so gut.
Mein eigentliches Problem ist jetzt, die Dateinamen sind nicht 100% identisch mit den Ordnernamen, sondern sie beginnen nur mit dem Ordnernamen!! Und genau dafür finde ich kein Script! Ich bekomme es einfach nicht hin!
Ich stelle das einmal zur besseren Verdeutlichung grafisch da.
Vorher:
c:\Test\Bearbeiten\
c:\Test\verzeichnis1
474 - Ü l452.txt
titel 1_543236.txt
titel#4 rh323.txt
titel7.txt
c:\Test\verzeichnis-xyz\
c:\Test\verzeichnis-xyz\0-1\
c:\Test\verzeichnis-xyz\474 - Ü\
c:\Test\verzeichnis-xyz\A\
c:\Test\verzeichnis-xyz\B\
c:\Test\verzeichnis-xyz\C\
...
c:\Test\verzeichnis-xyz\T\
c:\Test\verzeichnis-xyz\titel 1_54\
c:\Test\verzeichnis-xyz\titel#4 r\
c:\Test\verzeichnis-xyz\titel2\
c:\Test\verzeichnis-xyz\U\
...
Nach dem Sortieren:
c:\Bearbeiten\
titel7.txt
c:\Test\verzeichnis1\
c:\Test\verzeichnis-xyz\
c:\Test\verzeichnis-xyz\0-1\
c:\Test\verzeichnis-xyz\474 - Ü\
474 - Ü l452.txt
c:\Test\verzeichnis-xyz\A\
c:\Test\verzeichnis-xyz\B\
c:\Test\verzeichnis-xyz\C\
...
c:\Test\verzeichnis-xyz\T\
c:\Test\verzeichnis-xyz\titel 1_54\
titel 1_543236.txt
c:\Test\verzeichnis-xyz\titel#4 r\
titel#4 rh323.txt
c:\Test\verzeichnis-xyz\U\
...
Hier mein Script:
setlocal
chcp 1252
pushd "C:\Test\verzeichnis-xyz" || exit /b 1
dir /AD /B > C:\Test\titel.log
:Start
copy "C:\Test\titel.log" "C:\Test\verzeichnis1"
copy "C:\Test\titel.log" "C:\Test\verzeichnis-xyz"
set "Quelle=C:\Test\verzeichnis1"
set "Ziel=C:\Test\verzeichnis-xyz"
set "Typ=.txt"
set /p titel= <titel.log
set "Zielordner=%Ziel%\%titel%"
pushd "%Quelle%"
for /f "tokens=*" %%a in ('dir /b *%Typ%^|findstr "\%Typ%"') do if "%%~na"=="%titel%" move "%%a" "%Zielordner%"
for %%a in ("C:\Test\titel.log") DO (
more /e +1 "%%a">"%%a.tmp"
del "%%a" && ren "%%a.tmp" "%%~na.log"
)
set Datei=titel.log
if exist "%Datei%" for %%A in (%Datei%) do if %%~zA GTR 0 goto Start, Groesse: %%~zA
pause
popd
Kann mir bitte einer von den erfahrenen Profis hier bei meinem Problem helfen?
Danke!
Gruß,
Sully16
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 303364
Url: https://administrator.de/contentid/303364
Ausgedruckt am: 20.11.2024 um 06:11 Uhr
11 Kommentare
Neuester Kommentar
Hallo Sully16,
teste mal folgendes:
Der Code gibt nur aus, was er tun würde. Um ihn "scharf zu schalten" musst Du die
Ich bin anhand Deiner Beispieldaten davon ausgegangen, daß Dateien, für die kein Zielverzeichnis existiert, ebenfalls in das
Wenn die Zielverzeichnisse auf verschiedenen Festplatten liegen sollen, kannst Du Dir das Leben einfach machen, indem Du in
Gruß
Friemler
teste mal folgendes:
@echo off & setlocal
rem ****** Konfigurationsabschnitt ******
set "SrcFolder=C:\Test\verzeichnis1"
set "DstFolder=C:\Test\verzeichnis-xyz"
set "EditFolder=C:\Test\Bearbeiten"
rem *************************************
rem Alle Verzeichnisse im Zielverzeichnis auflisten
for /d %%d in ("%DstFolder%\*.*") do (
rem Alle Dateien im Quellverzeichnis auflisten und ihre Namen durch
rem einen Suchfilter laufen lassen, der alle Dateinamen liefert, die
rem mit dem Namen des aktuellen Verzeichnisses beginnen
for /f "delims=" %%f in ('dir /b /a:-d "%SrcFolder%" 2^>NUL ^| findstr /ibr /c:"%%~nxd.*"') do (
rem Aus dem Namen des aktuellen Verzeichnisses und dem Namen der aktuellen
rem Quelldatei den vollständigen Zielpfad erzeugen und prüfen, ob die Datei
rem bereits vorhanden ist
if not exist "%%d\%%~nxf" (
rem Wenn nicht, wird sie in das Verzeichnis verschoben
echo move "%SrcFolder%\%%~nxf" "%%d" > NUL
) else (
rem Wenn ja, wird sie in das Bearbeiten-Verzeichnis verschoben
echo move "%SrcFolder%\%%~nxf" "%EditFolder%" > NUL
)
)
)
rem Alle übrig gebliebenen Dateien ins Bearbeiten-Verzeichnis verschieben
echo move "%SrcFolder%\*.*" "%EditFolder%" > NUL
Der Code gibt nur aus, was er tun würde. Um ihn "scharf zu schalten" musst Du die
ECHO
-Befehle in den Zeilen 20, 23, und 29 entfernen.Ich bin anhand Deiner Beispieldaten davon ausgegangen, daß Dateien, für die kein Zielverzeichnis existiert, ebenfalls in das
Bearbeiten
-Verzeichnis verschoben werden sollen. Dafür dient Zeile 29.Wenn die Zielverzeichnisse auf verschiedenen Festplatten liegen sollen, kannst Du Dir das Leben einfach machen, indem Du in
C:\Test\verzeichnis-xyz
einen NTFS-Symlink oder eine NTFS-Junction auf das Zielverzeichnis erstellst (siehe Konsolenbefehl MKLINK
, Parameter /D
oder /J
, Administratorrechte erforderlich). Dann sind wir hier fertig. Sollte das nicht möglich sein, muss das Script noch erweitert werden, damit auch Zielverzeichnisse auf einer anderen Festplatte oder in einem anderen Verzeichnis als C:\Test\verzeichnis-xyz
gefunden werden.Gruß
Friemler
Hallo Sully16,
zuerstmal ganz grundsätzlich zum Debuggen von Bachscripts:
Speziell zu Deinem Fall:
Zu Deinen Fragen:
Verschwinden können Deine Dateien natürlich nicht, Du müllst Dir gerade irgendein Verzeichnis auf Deiner Platte zu. Schau Dir einfach mal die Ausgaben in der Konsole an, wenn das Script ohne
Tipp: Wenn Deine Dateinamen einen Punkt als Namensbestandteile enthalten (z.B.
das zu schreiben:
Grüße
Friemler
zuerstmal ganz grundsätzlich zum Debuggen von Bachscripts:
- Script aus einer Konsole starten, nicht per Doppelklick. Dann bleibt das Konsolenfenster offen und man sieht die Ausgaben des Scripts.
- Den Befehl
ECHO OFF
in Zeile 1 entfernen, damit man den Ablauf des Scripts im Konsolenfenster verfolgen kann.
Speziell zu Deinem Fall:
- Wenn Du Befehlsausgaben in eine Datei umleiten möchtest (z.B. in Zeile 35 und 40 bei den
MOVE
-Befehlen), musst Du natürlich evtl. in der entsprechenden Zeile enthaltene Ausgabeumleitungen zum NUL Device (> NUL
) entfernen, sonst werden die Ausgaben verschluckt. - Zum Durchführen von Debug-Sessions solltest Du die Eingabedaten (d.h. die Anzahl der Dateien) auf ein Minimum beschränken. Kopiere z.B. nur eine Auswahl von Dateien in Deine Quellverzeichnisse, von denen Du genau weißt, dass sie Probleme machen.
Zu Deinen Fragen:
- Der Parameter
/c
verhindert, dassFINDSTR
bei Leerzeichen im Suchbegriff (dem Verzeichnisnamen) die Namensteile als separate Suchbegriffe interpretiert. Ohne/c
würden die Dateien "474 - Ü l452.txt
" und "titel 1_543236.txt
" aus Deinen Testdaten imBearbeiten
-Verzeichnis landen. %%~nxd
erzeugt den kompletten Dateinamen, incl. Erweiterung. Denn
Zitat von @Friemler aus dem Tutorial zur FOR-Schleife
Die o.g. Kürzel/Operatoren können auch kombiniert werden.
Die o.g. Kürzel/Operatoren können auch kombiniert werden.
Verschwinden können Deine Dateien natürlich nicht, Du müllst Dir gerade irgendein Verzeichnis auf Deiner Platte zu. Schau Dir einfach mal die Ausgaben in der Konsole an, wenn das Script ohne
ECHO OFF
läuft.Tipp: Wenn Deine Dateinamen einen Punkt als Namensbestandteile enthalten (z.B.
Meine.Datei.txt
), könnte das Probleme machen, da der FINDSTR
-Befehl in Zeile 25 den Punkt zwischen Meine
und Datei
als Teil seines Regulären Ausdrucks (Suchbegriffs) interpretieren würde - der Punkt steht für ein beliebiges Zeichen. Du könntest in dem Fall versuchen, stattfindstr /ibr /c:"%%~nxd.*"
das zu schreiben:
findstr /ib /c:"%%~nxd"
Grüße
Friemler
Hallo Sully16,
lass Dich nicht von dem verwirren, was in der Log-Datei steht. Die Windows Konsolenbefehle schreiben Ausgaben immer noch in der Zeichen-Codierung, die schon zu DOS-Zeiten benutzt wurde, die sog. Codepage 850 (deutsches Windows).
Wenn Du das Log mit Notepad öffnest, wird der Dateiinhalt so interpretiert, als wäre er mit der Standard-Windows Zeichen-Codierung geschrieben worden, der Codepage 1252 (deutsches Windows). Deshalb siehst Du statt der deutschen Umlauten irgendwelche andere Zeichen. Der Konsolenbefehl
zeigt den korrekten Inhalt der Datei an.
Schau Dir die Ausgabe des Scriptlaufs ohne
Unabhängig davon habe ich jedoch Deine Aufgabenstellung nicht richtig verstanden. Die Verzeichnisebene mit diesen Register-Ordnern habe ich nicht berücksichtigt. Sind die denn wirklich notwendig? Für eine alphabetische Sortierung werden sie nicht benötigt, das macht der Windows Explorer sowieso oder auch ein
auf der Konsole.
Wenn diese Register-Verzeichnisebene nicht verzichtbar ist, werfe ich das Handtuch. Die Operationen zum Extrahieren des ersten Zeichens aus dem Dateinamen, um den richtigen Register-Ordner zu identifizieren, sind nicht "sonderzeichenfest".
Gruß
Friemler
lass Dich nicht von dem verwirren, was in der Log-Datei steht. Die Windows Konsolenbefehle schreiben Ausgaben immer noch in der Zeichen-Codierung, die schon zu DOS-Zeiten benutzt wurde, die sog. Codepage 850 (deutsches Windows).
Wenn Du das Log mit Notepad öffnest, wird der Dateiinhalt so interpretiert, als wäre er mit der Standard-Windows Zeichen-Codierung geschrieben worden, der Codepage 1252 (deutsches Windows). Deshalb siehst Du statt der deutschen Umlauten irgendwelche andere Zeichen. Der Konsolenbefehl
type M:\Bearbeiten\friemler.log
Schau Dir die Ausgabe des Scriptlaufs ohne
ECHO OFF
in der Konsole an. Das ist zwar viel Zeug, führt Dich aber eher auf die Spur des Fehlers als eine Log-Datei in der falschen Zeichen-Codierung.Unabhängig davon habe ich jedoch Deine Aufgabenstellung nicht richtig verstanden. Die Verzeichnisebene mit diesen Register-Ordnern habe ich nicht berücksichtigt. Sind die denn wirklich notwendig? Für eine alphabetische Sortierung werden sie nicht benötigt, das macht der Windows Explorer sowieso oder auch ein
dir /o:gne
Wenn diese Register-Verzeichnisebene nicht verzichtbar ist, werfe ich das Handtuch. Die Operationen zum Extrahieren des ersten Zeichens aus dem Dateinamen, um den richtigen Register-Ordner zu identifizieren, sind nicht "sonderzeichenfest".
Gruß
Friemler
Hallo Sully16,
ich vermute mal, ich habe das mit Deinen Registerordnern jetzt verstanden. Hier eine aktualisierte Version des Scripts, evtl. funktioniert es dann.
Wenn Fragen zu Konsolenbefehlen auftauchen, kann man zunächst einmal die Hilfe des entsprechenden Befehls aufrufen, z.B.
Gruß
Friemler
[EDIT]
Bugfix 07.05. 2016: O.g. Änderung führte zu Fehlfunktionen.
[/EDIT]
ich vermute mal, ich habe das mit Deinen Registerordnern jetzt verstanden. Hier eine aktualisierte Version des Scripts, evtl. funktioniert es dann.
@echo off & setlocal
rem ****** Konfigurationsabschnitt ******
set "SrcFolder=C:\Test\verzeichnis1"
set "DstFolder=C:\Test\verzeichnis-xyz"
set "EditFolder=C:\Test\Bearbeiten"
rem *************************************
rem Alle Verzeichnisse im Zielverzeichnis auflisten,
rem deren Name mindestens 2 Zeichen lang ist
for /f "delims=" %%d in ('dir /b /a:d "%DstFolder%" 2^>NUL ^| findstr /ibr /c:"...*"') do (
rem Alle Dateien im Quellverzeichnis auflisten und ihre Namen durch
rem einen Suchfilter laufen lassen, der alle Dateinamen liefert, die
rem mit dem Namen des aktuellen Verzeichnisses beginnen
for /f "delims=" %%f in ('dir /b /a:-d "%SrcFolder%" 2^>NUL ^| findstr /ib /c:"%%d"') do (
rem Aus dem Namen des aktuellen Verzeichnisses und dem Namen der aktuellen
rem Quelldatei den vollständigen Zielpfad erzeugen und prüfen, ob die Datei
rem bereits vorhanden ist
if not exist "%DstFolder%\%%d\%%f" (
rem Wenn nicht, wird sie in das Verzeichnis verschoben
move "%SrcFolder%\%%f" "%DstFolder%\%%d" > NUL
) else (
rem Wenn ja, wird sie in das Bearbeiten-Verzeichnis verschoben
move "%SrcFolder%\%%f" "%EditFolder%" > NUL
)
)
)
rem Alle übrig gebliebenen Dateien ins Bearbeiten-Verzeichnis verschieben
move "%SrcFolder%\*.*" "%EditFolder%" > NUL
Wenn Fragen zu Konsolenbefehlen auftauchen, kann man zunächst einmal die Hilfe des entsprechenden Befehls aufrufen, z.B.
findstr /?
Gruß
Friemler
[EDIT]
Bugfix 07.05. 2016: O.g. Änderung führte zu Fehlfunktionen.
[/EDIT]
Ist schon eine ganze Weile her, und ich bin gerade über Google über diesen Eintrag gestolpert, da ich vor einem ähnlichen Problem stand.
Da DOS-Skript eine ordentliche Menge Fachwissen und Arbeit erfordert, möchte ich kurz eine Alternative erwähnen:
Der Total Commander (www.ghisler.com) ist eine Windows-Variante des alten Zwei-Fenster Norton Commander. Er beherrscht u.a. auch Massenumbennenung von Dateien unter Einbeziehung regulärer Ausdrücke. Wenig bekannt, aber funktioniert: Diese Umbenennung schließt auch das Verschieben in andere Verzeichnisse mit ein.
Als Beispiel bei mir: Es liegt eine Riesenliste von Dateien mit Namen in folgender Form vor:
'Kategorie - Titel.ext'
Ich möchte pro Kategorie einen Ordner, in diesen soll die Datei nur noch mit dem Namen 'Titel.ext' verschoben werden.
Geht tatsächlich mit dem TC in einem einzigen Umbenenn-Schritt:
Suchen nach (RegEx aktiviert):
(.*) \- (.*)\.ext
Ersetzen durch:
.\\$1\\$2.ext
(Wichtig: Doppelte Backslashes)
Das Ergebnis ist wie gewünscht eine Reihe von Ordnern der \Kategorie\Titel
Mehrere Titel derselben Kategorie landen tatsächlich im selben Ordner.
Wer auf 'Nummer Sicher' gehen möchte, kopiert erst alle ursprünglichen Dateien in einen Testordner. Im TC einfach mit [F5]. Und lässt die Umbenennung dort durchlaufen.
Ich hoffe, der eine oder andere kann mit dieser kurzen Lösung etwas anfangen. Ist kein 'pure DOS', ist klar. Wenn man einmal verstanden hat, wie's geht, funktioniert es dafür ohne großen Gehirnschmalz in zwei Minuten.
Da DOS-Skript eine ordentliche Menge Fachwissen und Arbeit erfordert, möchte ich kurz eine Alternative erwähnen:
Der Total Commander (www.ghisler.com) ist eine Windows-Variante des alten Zwei-Fenster Norton Commander. Er beherrscht u.a. auch Massenumbennenung von Dateien unter Einbeziehung regulärer Ausdrücke. Wenig bekannt, aber funktioniert: Diese Umbenennung schließt auch das Verschieben in andere Verzeichnisse mit ein.
Als Beispiel bei mir: Es liegt eine Riesenliste von Dateien mit Namen in folgender Form vor:
'Kategorie - Titel.ext'
Ich möchte pro Kategorie einen Ordner, in diesen soll die Datei nur noch mit dem Namen 'Titel.ext' verschoben werden.
Geht tatsächlich mit dem TC in einem einzigen Umbenenn-Schritt:
Suchen nach (RegEx aktiviert):
(.*) \- (.*)\.ext
Ersetzen durch:
.\\$1\\$2.ext
(Wichtig: Doppelte Backslashes)
Das Ergebnis ist wie gewünscht eine Reihe von Ordnern der \Kategorie\Titel
Mehrere Titel derselben Kategorie landen tatsächlich im selben Ordner.
Wer auf 'Nummer Sicher' gehen möchte, kopiert erst alle ursprünglichen Dateien in einen Testordner. Im TC einfach mit [F5]. Und lässt die Umbenennung dort durchlaufen.
Ich hoffe, der eine oder andere kann mit dieser kurzen Lösung etwas anfangen. Ist kein 'pure DOS', ist klar. Wenn man einmal verstanden hat, wie's geht, funktioniert es dafür ohne großen Gehirnschmalz in zwei Minuten.