Batch Frage zur for-Schleife in Batch

Obinobi

Cadet 4th Year
Registriert
Mai 2005
Beiträge
94
Hallo Leute,

mein Batch-Programm läuft fast einwandfrei. Nur die Regeln, die bei der for-Schleife zu beachten sind, bereiten mir Kopfzerbrechen.

Mein Programm soll folgendes können:
-Leerzeichen aller Dateinamen von Textfiles durch ein "_" ersetzen.
-jede einzelne Textfile soll einen unverwechselbaren Zeitstempel im Dateinamen erhalten

Mein Ansatz ist folgender:

------------------------------------------------------------

echo off
setlocal enabledelayedexpansion
for %%a in ( *.txt ) do (
set filename=%%~na
set filename=!filename: =_!
set zeit=%TIME:~0,2%.%TIME:~3,2%.%TIME:~6,2%
rename "%%a" "!filename!_!zeit!_%%~xa"
timeout /t 1
)
pause

------------------------------------------------------------

Urpsrüngliche Text-files:
a a a a.txt
b b b b.txt
c c c c.txt

So sollte es aussehen:

a_a_a_a_19.27.42.txt
b_b_b_b_19.27.43.txt
c_c_c_c_19.27.44.txt


Ergebnis:

a_a_a_a_19.27.42__19.27.42_.txt <<-- WARUM??? WARUM???
b_b_b_b_19.27.43.txt
c_c_c_c_19.27.44.txt

Kennt von euch vielleicht jemand eine Lösung zu diesem Problem?

Vielen Dank im Voraus!!!
 
Warum ganeu eine einzelne Datei bei einer solchen For-Schleife zweimal dran kommt weiß ich nicht, kann Dir aber eine Lösung zum Problem anbieten.
Verändern musst Du eigentlich nur Zeile 3:
In Zeile 7 habe ich noch den abschließenden Unterstrich nach der Zeit entfernt.

Code:
echo off
setlocal enabledelayedexpansion
for /f "delims=" %%a in ('dir /b *.txt') do (
set filename=%%~na
set filename=!filename: =_!
set zeit=!TIME:~0,2!.!TIME:~3,2!.!TIME:~6,2!
rename "%%a" "!filename!_!zeit!%%~xa"
timeout /t 1
)
pause

Edit: nach Hinweis von simpsonsfan Zeile 6 angepasst
 
Zuletzt bearbeitet:
Du hast noch die verzögerte Expansion beim Datum vergessen, in Zeile 6 bitte auch noch ! verwenden. Das Ergebnis aus Post 1 passt auch nicht zum Beispielcode, da stünde überall die gleiche Sekunde bzw. sonst in der ersten Zeile zwei Zeiten, da die Datei einfach zweimal bearbeitet wurde.
 
Danke für die schnellen Rückmeldungen!

@HDScratcher: Super,vielen Dank, der Code funktioniert!!! Könntest du mir erklären, was das "delims=" (mit Defaultwert space) da macht? Delims spaltet doch bei jedem Leerzeichen den Dateinamen in einzelne Fragmente auf? Ohne Tokens delims zu verwenden ist mir neu.

@simpsonsfan : Du hast recht, ich hatte die ältere Version vom Code reinkopiert. Würde es deiner Meinung nach auch so funktionieren (leider wird der Zeitstempel wieder zweimal in den ersten Dateinamen geschrieben):


Code:
setlocal enabledelayedexpansion
for %%a in ( *.txt ) do (
set filename=%%~na
set filename=!filename: =_!
setlocal enabledelayedexpansion
set zeit=!TIME:~0,2!.!TIME:~3,2!.!TIME:~6,2!
rename "%%a" "!filename!_!zeit!%%~xa"
timeout /t 1
)
pause
 
delims hat als Default das Leerzeichen, da dies aber auch Bestandteil Deiner Dateinamen ist, muss das geändert werden.
Mit "delims=" gibt es keine Trennzeichen mehr (außer dem Zeilenumbruch).
 
Noch eine Frage zu !TIME!. Ich würde gerne pro Schleifendurchlauf die Minutenzahl um 1 erhöhen. Aus dem Zeitstempel würde ich gerne die Sekunden entfernen und dafür die Differenzierung der Dateien über die Minutenzahl ermöglichen.

Bei "timeout /t 60" müsste das Programm ja jedes mal warten, das würde mir aber zu lange dauern.

Gibt es deshalb so etwas wie:

set minuten=!TIME:~3,2! += 1 (funktioniert ja leider so nicht)

set zeit=!TIME:~0,2!.!minuten!
 
Zurück
Oben