Batch FOR Schleife mit Variablen

leipziger1979

Rear Admiral
Registriert
Dez. 2014
Beiträge
6.111
Habe hier ein kleines Problem, dessen Lösung vermutlich simpel ist, aber... :)

Habe viele Dateien die in ihrem Namen Datum und Uhrzeit enthalten, hier im Beispiel die 3 Textdateien:

2018-08-17 16 45 31.jpg


In der CMD soll nun eine Batch aufgerufen werden mit der alle Dateien übergeben werden.
Dort soll das Datum und Uhrzeit in Variablen geschrieben werden die es dann im Abschluss an das Programm filetouch übergibt und das ändert dann das Datum und die Uhrzeit der Dateien.

Wenn ich die datumchange.bat nutze und eine Datei übergebe funktioniert es:

Code:
set filename=%1
set jahr=%filename:~0,4%
set monat=%filename:~5,2%
set tag=%filename:~8,2%
set stunde=%filename:~11,2%
set minute=%filename:~14,2%
set sekunde=%filename:~17,2%
echo %jahr%
echo %monat%
echo %tag%
echo %stunde%
echo %minute%
echo %sekunde%
filetouch /D %monat%-%tag%-%jahr% /T %stunde%:%minute%:%sekunde% %1

Wenn ich jedoch die datumchangefor.bat nutze, und es über eine FOR Schleife für jede Datei läuft, funktioniert es nicht:

Code:
for %%i in (%1) do (
set filename=%%i
set jahr=%filename:~0,4%
set monat=%filename:~5,2%
set tag=%filename:~8,2%
set stunde=%filename:~11,2%
set minute=%filename:~14,2%
set sekunde=%filename:~17,2%
echo %jahr%
echo %monat%
echo %tag%
echo %stunde%
echo %minute%
echo %sekunde%
filetouch /D %monat%-%tag%-%jahr% /T %stunde%:%minute%:%sekunde% %%i
)

Man sieht schön das zwar die Dateien richtig eingelesen werden und auch an das Programm übergeben werden aber das mit den Variablen funktioniert nicht.

2018-08-17 16 50 08.jpg


Habe auch schon das mit "setlocal enabledelayedexpansion" in der Batch versucht, hat aber auch nicht geklappt.
Die ECHO sind momentan nur zum prüfen drin.

Hat einer eine Idee warum es nicht geht ?
 

Anhänge

Die Variablen sind leer deshalb gibt ECHO nur den Status von ECHO zurück...

Besser wäre das Problem wohl mit PowerShell oder einer Konsolenanwendung zu lösen...
 
Die Variablen werden aber damit gefüllt:

Code:
set filename=%%i
set jahr=%filename:~0,4%
set monat=%filename:~5,2%
set tag=%filename:~8,2%
set stunde=%filename:~11,2%
set minute=%filename:~14,2%
set sekunde=%filename:~17,2%

Wie gesagt, wenn ich die erste Batch aufrufe und eine Datei übergebe geht es.
Die 7 Variablen werden schön gesetzt und an filetouch übergeben:

2018-08-17 18 45 35.jpg


Wenn ich die Batch um FOR Schleife erweitere um, im Beispiel alle *.txt Dateien, zu ändern funktioniert es nicht.
Die Frage ist warum funktioniert das mit den Variablen in der FOR Schleife nicht.
 
set jahr=%filename:~0,4%

hier ist filename bereits String.Empty

lässt sich nicht %%i statt %filename% verwenden?
 
Weil du % statt ! nutzt würde ich spontan vermuten. Ergo werden die Variablen eben nicht gefüllt.
Dein ganzer Ansatz scheint mir allerdings sehr umständlich. Und dass es Filetouch zum umbennenen braucht, ist erstmal auch nicht nachvollziehbar. Hier mal eine Zeile die mir dazu einfällt:
Code:
for /f "tokens=1-6 delims=-" %%a in ('dir /b *.txt') do echo %%a-%%b-%%c %%d:%%e:%%f

Die Schleife mit einem 'ren' oder 'filetouch' statt 'echo' zu nutzen und die Tokens ggf. nach bedarf zu ordnen, sollte da nicht mehr das Problem sein. Den Part mit 'dir /b' kannst du natürlich auch durch '%1' ersetzen, wie in deinem Beispiel, wenn du jede Datei einzeln draufziehen, bzw. als Parameter nutzen willst. So wie es da steht, arbeitet er alle .txt Dateien im aktuellen Ordner ab.

/edit
Mein Fehler mit Filetouch... dachte du wolltest die dateien umbennen, nicht Dateidatum ändern.
 
Zuletzt bearbeitet:
@ minischniepel

Code:
for /f "tokens=1-6 delims=-" %%a in ('dir /b %1') do echo %%b-%%c-%%a %%d:%%e:%%f

Die Zeile funktioniert so erstmal:

2018-08-17 19 37 28.jpg


Leider geht durch das tokens jedoch der Dateiname verloren den ich später übergeben muss.
Wie komme ich an den wieder ran ?
Ergänzung ()

Habe es hinbekommen. :D
Einfach tokens um einen weiteren Eintrag %%g erweitert und den Dateinamen hinten wieder zusammengebaut:

Code:
for /f "tokens=1-7 delims=-" %%a in ('dir /b %1') do filetouch /D %%b-%%c-%%a /T %%d:%%e:%%f %%a-%%b-%%c-%%d-%%e-%%f-%%g

2018-08-17 20 01 09.jpg


Danke nochmal an minischniepel für die Lösung mit dem tokens.
Wäre ich nicht drauf gekommen.

Aber wie das mit Variablen und FOR Schleifen mit den % oder ! funktioniert muss ich mir mal in Ruhe anschauen.:)
 
Zuletzt bearbeitet:
Um Probleme zu vermeiden, würde ich statt %%g für die Dateiendung, %%~xa verwenden.
Respektive: %~x1
 
Zuletzt bearbeitet:
Es fehlt Setlocal EnableDelayedExpansion.
Ohne diese Einstellung kann nicht auf den Wert von innerhalb einer Schleife geänderte Variablen zugegriffen werden. Zusätzlich muss dabei mit !variable! statt %variable% gearbeitet werden werden.

Also so:
Code:
Setlocal EnableDelayedExpansion

for %%i in (%1) do (
set filename=%%i
set jahr=!filename:~0,4!
set monat=!filename:~5,2!
set tag=!filename:~8,2!
set stunde=!filename:~11,2!
set minute=!filename:~14,2!
set sekunde=!filename:~17,2!
echo !jahr!
echo !monat!
echo !tag!
echo !stunde!
echo !minute!
echo !sekunde!
filetouch /D !monat!-!tag!-!jahr! /T !stunde!:!minute!:!sekunde! %%i
)
 
Zurück
Oben