Dateiname auslesen und zerlegen , Ordner erstellen und dann verschieben
Guten Tag zusammen,
ich möchte Dateien anhand der Namen in einer Textdatei verschieben. Sie sollen in einen Ordner verschoben werden, der sich aus der Textdatei ergibt bzw. aus dem Suchstring. Die Dateien haben verschiedene Endungen, der Name kann irgendwo im Dateinamen stehen.
Als DAU habe ich mir folgendes zusammengefrickelt.
eispielinhalt Textdatei.
dazu folgender Code, den ich mir zusammengesucht und gebastelt habe
Das Skript funktioniert allerdings nur teilweise: Der Zielorder wird erstellt, die Dateien werden gefunden und verschoben. Allerdings in den Hauptordner (ZIEL), nicht in den neu erstellten.
Dankbar für jede Anregung und Hilfe.
Gruß
Ingo
ich möchte Dateien anhand der Namen in einer Textdatei verschieben. Sie sollen in einen Ordner verschoben werden, der sich aus der Textdatei ergibt bzw. aus dem Suchstring. Die Dateien haben verschiedene Endungen, der Name kann irgendwo im Dateinamen stehen.
Als DAU habe ich mir folgendes zusammengefrickelt.
eispielinhalt Textdatei.
Max Mustermann (loeschen)
Peter Post (FP13)
Harry Hirsch
Ernst Ernsthaft
dazu folgender Code, den ich mir zusammengesucht und gebastelt habe
CHCP 1252
@echo off & setlocal
REM ### Testdatei mit Namen festlegen
set "Liste=L:\Namen.txt"
REM ### Ziel festlegen
set "Ziel=Z:\Namen-sortiert"
REM ### Textdatei auslesen und zerlegen / Zielordner zusammensetzen
FOR /F "usebackq tokens=1,2,3,4 delims=_ " %%a IN ("%Liste%") do (
set "Zielordner="Z:\Namen-sortiert\%%a %%b %%c%%d"
md "%Ziel%\%%a %%b %%c%%d" 2>nul
REM ### TEST
REM echo "%Ziel%\%%a %%b %%c%%d"
REM echo %%a %%b %%c %%d
REM echo %Ziel%
REM echo %Zielordner%
move "*%%a*%%b*" "%Ziel%\%Zielordner%"
)
pause
Das Skript funktioniert allerdings nur teilweise: Der Zielorder wird erstellt, die Dateien werden gefunden und verschoben. Allerdings in den Hauptordner (ZIEL), nicht in den neu erstellten.
Dankbar für jede Anregung und Hilfe.
Gruß
Ingo
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 581284
Url: https://administrator.de/forum/dateiname-auslesen-und-zerlegen-ordner-erstellen-und-dann-verschieben-581284.html
Ausgedruckt am: 03.04.2025 um 17:04 Uhr
2 Kommentare
Neuester Kommentar
Moin Ingo,
Stichwort Variablenverzögerung.
Wenn du eine Variable innerhalb einer Befehlsgruppierung (in deinem Fall die For-Schleife) setzt; und diese Variable innerhalb der selben Gruppierung wieder aufrufen willst, musst du die Variable verzögern, sonst gibt sie dir den Wert aus, den sie vor der Gruppierung hatte.
Einfaches Beispiel zur Veranschaulichung:
Das Skript soll für die Buchstaben A,B,C,D&E jeweis die Variable %count% um 1 erhöhen.
Wie du feststellen wirst, zeigt der Zählerstand jedoch immer 0 an - als hätte der Zähler nicht funktioniert. Am Endstand, der korrekt bei 5 liegt, sieht man jedoch, dass der Zähler funktioniert hat.
Nun das selbe, diesmal mit Variablenverzögerung:
Die Variablenverzögerung wird für das Skript einmalig durch setlocal EnableDelayedExpansion aktiviert. Verzögerte Variablen werden mit !Variablenname! statt %Variablenname% aufgerufen.
Auf dein Skript übertragen: Die Variable %Zielordner% ist vor der For-Schleife noch leer, wird also innerhalb des move-Befehls durch nichts ersetzt.
Darüber hinaus:
ist falsch. Die Anführungszeichen hinter dem Gleichzeichen sind zu viel und werden Probleme bereiten.
Gruß Thomas
Stichwort Variablenverzögerung.
Wenn du eine Variable innerhalb einer Befehlsgruppierung (in deinem Fall die For-Schleife) setzt; und diese Variable innerhalb der selben Gruppierung wieder aufrufen willst, musst du die Variable verzögern, sonst gibt sie dir den Wert aus, den sie vor der Gruppierung hatte.
Einfaches Beispiel zur Veranschaulichung:
@echo off
set count=0
for %%a in (A B C D E) do (
set /a count+=1
echo Zaehlerstand=%count%
)
echo Endstand=%count%
cmd /c pause
Wie du feststellen wirst, zeigt der Zählerstand jedoch immer 0 an - als hätte der Zähler nicht funktioniert. Am Endstand, der korrekt bei 5 liegt, sieht man jedoch, dass der Zähler funktioniert hat.
Nun das selbe, diesmal mit Variablenverzögerung:
@echo off
setlocal EnableDelayedExpansion
set count=0
For %%a in (A B C D E) do (
set /a count+=1
echo Zaehlerstand=!count!
)
echo Endstand=%count%
cmd /c pause
Auf dein Skript übertragen: Die Variable %Zielordner% ist vor der For-Schleife noch leer, wird also innerhalb des move-Befehls durch nichts ersetzt.
Darüber hinaus:
set "Zielordner="Z:\Namen-sortiert\%%a %%b %%c%%d"
:: Entweder so
set "Zielordner=Z:\Namen-sortiert\%%a %%b %%c%%d"
:: oder gleich ganz ohne Anführungszeichen
set Zielordner=Z:\Namen-sortiert\%%a %%b %%c%%d
Gruß Thomas