preacherb
Goto Top

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.
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

Content-Key: 581284

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

Printed on: April 19, 2024 at 11:04 o'clock

Member: TK1987
Solution TK1987 Jun 23, 2020 at 11:10:59 (UTC)
Goto Top
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:
@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
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:
@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
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:
 set "Zielordner="Z:\Namen-sortiert\%%a %%b %%c%%d"  
ist falsch. Die Anführungszeichen hinter dem Gleichzeichen sind zu viel und werden Probleme bereiten.
:: 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
Member: PreacherB
PreacherB Jun 24, 2020 at 07:30:36 (UTC)
Goto Top
Guten Morgen Thomas,

vielen Dank für die Erklärung!

Variablenverzögerung hatte ich - ehrlich gesagt - noch nie gehört.

Auch ohne die Verzögerung hat das Skript funktioniert, nachdem ich das überschüssige " entfernt, also Zeile 2 Deines zweiten Codes verwendet habe. Aus irgendeinem Grund hat es trotzdem funktioniert - für mich reicht das im Moment.

Danke für die Hilfestellung.

Gruß
Ingo