SET in FORFILES geht nicht
Hallo zusammen,
möchte mit Batch die älteste (bzw. neuste) Datei innerhalb eines Pfades (Directory samt Unterverzeichnissen) ermitteln
Da die Erstellungszeit einer Datei im Format TT.MM.JJJJ abgelegt ist taugt sie nicht zum sortieren.
Ich wandle deshalb das Erstellungsdatum mit einer FOR-Schleife um, so dass es die Form JJJJ.MM.TT hat.
Diese Umwandlung soll für alle Dateien, die mittels FORFILES ermittelt werden, durchgeführt werden. Gleichzeitig soll dabei mittels eines IF Konstruktes geprüft werden, ob das aktuell umgewandelte Datum das älteste ist.
Der Vergleich soll über die (Umgebungs)Variable > xold < erfolgen.
Der komplette Befehl steht in einem Batchfile und sieht wie folgt aus:
setlocal enabledelayedexpansion
rem initialisierung des ältesten Datums
set xold="20101231"
forfiles /P "C:\temp" /S /C "cmd /c for /F 0x22 tokens=1,2,3 delims=.0x22 %%a in (0x22@fdate0x22) do if 0x22%%c%%b%%a0x22 lss 0x22!xold!0x22 (set xold=%%c%%b%%a) else (echo WarNix)"
echo aeltestes Datum ist %xold%
rem falls wegen verzögerter Auflösung erforderlich:
echo aeltestes Datum ist !xold!
Es funktioniert auch alles, bis auf den Teil > set xold=%%c%%b%%a < . Alle Versuche was mit SET in die Variable > xold < zu packen sind wirkungslos.
Steht anstelle des SET im WAHR-Teil des IF-Konstruktes ein > echo japp <, so wird -je nach jeweilgen Datum der aktuell bearbeiteten Datei- das > japp < ausgegeben.
Hier noch paar kurze Anmerkungen zum Aufbau
- Datumswerte habe ich zur Unterscheidung von Zahlen in Hochkomma gesetzt.
Grund Gefahr mit Verwechslung von Dezimalzahlen und Oktalzahlen (die Präfix 0 haben). Ist 09 Dezimal der 9.te Tag oder die Oktalzahl 09 (die unzulässig wäre, da Oktal ja nur bis 8 geht)
- FOR Schleife zum Datumssort lautet in Einfachform:
for /F "tokens=1,2,3 delims=." %%a in ("%date%") do set old=%%c%%b%%a
Da sie hier aber im Befehlsteil des FORFILES commands steht, welcher in Hochkomma gesetzt sein muss, können keine Hochkommas verwendet werden.
Diese wurden daher durch das 0x22 (HexWert für ") ersetzt.
Das %date% wurde durch die Datumsfunktion des FORFILES, also @fdate, ersetzt
- Verzögerte Auflösung der Umgebungsvariablen
Hier habe ich bereits gesetzt : setlocal enabledelayedexpansion
Den Vergleich mit dem Wert der Variablen >xold <, die ja in Schleifen nur beim Einlesen aufgelöst wird, habe ich daher mit dem empfohlenen !xold! statt %xold% durchgeführt.
Der IF / ELSE Teil wird ja auch korrekt erkannt.
- Filename @File und Pfad @path könnten, ist erst mal das älteste Datum in der Variablen, sicher leicht zugefügt werden.
Also wäre sehr schön, wenn jemand sagen könnte wie man den SET dazu bringen könnte das älteste Datum aufzunehmen,
ODER: Vielleicht hilft ja auch ein total neuer Gedankenansatz!
Vielen Dank für Eure Hilfe!
Franz
möchte mit Batch die älteste (bzw. neuste) Datei innerhalb eines Pfades (Directory samt Unterverzeichnissen) ermitteln
Da die Erstellungszeit einer Datei im Format TT.MM.JJJJ abgelegt ist taugt sie nicht zum sortieren.
Ich wandle deshalb das Erstellungsdatum mit einer FOR-Schleife um, so dass es die Form JJJJ.MM.TT hat.
Diese Umwandlung soll für alle Dateien, die mittels FORFILES ermittelt werden, durchgeführt werden. Gleichzeitig soll dabei mittels eines IF Konstruktes geprüft werden, ob das aktuell umgewandelte Datum das älteste ist.
Der Vergleich soll über die (Umgebungs)Variable > xold < erfolgen.
Der komplette Befehl steht in einem Batchfile und sieht wie folgt aus:
setlocal enabledelayedexpansion
rem initialisierung des ältesten Datums
set xold="20101231"
forfiles /P "C:\temp" /S /C "cmd /c for /F 0x22 tokens=1,2,3 delims=.0x22 %%a in (0x22@fdate0x22) do if 0x22%%c%%b%%a0x22 lss 0x22!xold!0x22 (set xold=%%c%%b%%a) else (echo WarNix)"
echo aeltestes Datum ist %xold%
rem falls wegen verzögerter Auflösung erforderlich:
echo aeltestes Datum ist !xold!
Es funktioniert auch alles, bis auf den Teil > set xold=%%c%%b%%a < . Alle Versuche was mit SET in die Variable > xold < zu packen sind wirkungslos.
Steht anstelle des SET im WAHR-Teil des IF-Konstruktes ein > echo japp <, so wird -je nach jeweilgen Datum der aktuell bearbeiteten Datei- das > japp < ausgegeben.
Hier noch paar kurze Anmerkungen zum Aufbau
- Datumswerte habe ich zur Unterscheidung von Zahlen in Hochkomma gesetzt.
Grund Gefahr mit Verwechslung von Dezimalzahlen und Oktalzahlen (die Präfix 0 haben). Ist 09 Dezimal der 9.te Tag oder die Oktalzahl 09 (die unzulässig wäre, da Oktal ja nur bis 8 geht)
- FOR Schleife zum Datumssort lautet in Einfachform:
for /F "tokens=1,2,3 delims=." %%a in ("%date%") do set old=%%c%%b%%a
Da sie hier aber im Befehlsteil des FORFILES commands steht, welcher in Hochkomma gesetzt sein muss, können keine Hochkommas verwendet werden.
Diese wurden daher durch das 0x22 (HexWert für ") ersetzt.
Das %date% wurde durch die Datumsfunktion des FORFILES, also @fdate, ersetzt
- Verzögerte Auflösung der Umgebungsvariablen
Hier habe ich bereits gesetzt : setlocal enabledelayedexpansion
Den Vergleich mit dem Wert der Variablen >xold <, die ja in Schleifen nur beim Einlesen aufgelöst wird, habe ich daher mit dem empfohlenen !xold! statt %xold% durchgeführt.
Der IF / ELSE Teil wird ja auch korrekt erkannt.
- Filename @File und Pfad @path könnten, ist erst mal das älteste Datum in der Variablen, sicher leicht zugefügt werden.
Also wäre sehr schön, wenn jemand sagen könnte wie man den SET dazu bringen könnte das älteste Datum aufzunehmen,
ODER: Vielleicht hilft ja auch ein total neuer Gedankenansatz!
Vielen Dank für Eure Hilfe!
Franz
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 117624
Url: https://administrator.de/forum/set-in-forfiles-geht-nicht-117624.html
Ausgedruckt am: 24.05.2025 um 08:05 Uhr
3 Kommentare
Neuester Kommentar
Hallo fmerst und willkommen im Forum!
Versuch es mal so:
Einschränkung: Gefunden wird die erste Datei mit dem ältesten Datum, die Uhrzeit wird ignoriert.
Voraussetzung ist, dass Jahreszahlen 4-stellig ausgegeben werden.
Grüße
bastla
Versuch es mal so:
@echo off & setlocal enabledelayedexpansion
set "Basis=C:\Temp"
set "xold=99999999"
set "fold="
for /f "delims=" %%i in ('dir /s /b /a-d "%Basis%"') do (
set "D=%%~ti"
set "D=!D:~6,4!!D:~3,2!!D:~,2!"
if !D! lss !xold! (
set "xold=!D!"
set "fold=%%i"
)
)
echo aelteste Datei: %xold:~6,2%.%xold:~4,2%.%xold:~,4% %fold%
Voraussetzung ist, dass Jahreszahlen 4-stellig ausgegeben werden.
Grüße
bastla