Dateien suchen in einem bestimmten Zeitraum und Archivbit setzen
Hallo Zusammen,
benötige Hilfe für die erstellung einer kleinen Batchdatei. Folgendes soll ausgeführt werden:
Suche in einer Pfadangabe inkl. Unterverzeichnissen nach allen Dateien *.* in einem bestimmten Zeitraum (Erstellungsdatum). Setze bei allen diesen Dateien das Archivbit!
Finde irgendwie nichts passendes. Kann mir da jemand helfen?
Danke und Gruß Mike
benötige Hilfe für die erstellung einer kleinen Batchdatei. Folgendes soll ausgeführt werden:
Suche in einer Pfadangabe inkl. Unterverzeichnissen nach allen Dateien *.* in einem bestimmten Zeitraum (Erstellungsdatum). Setze bei allen diesen Dateien das Archivbit!
Finde irgendwie nichts passendes. Kann mir da jemand helfen?
Danke und Gruß Mike
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 140911
Url: https://administrator.de/forum/dateien-suchen-in-einem-bestimmten-zeitraum-und-archivbit-setzen-140911.html
Ausgedruckt am: 14.04.2025 um 22:04 Uhr
8 Kommentare
Neuester Kommentar
Hallo @zeroblue2005,
Hier mal ein Debug-entwurf (macht noch nichts):
Ist fast fertig.
Ich hoffe doch, dein Datum ist im Format DD.MM.YYYY formatiert...
Snow
benötige Hilfe für die erstellung einer kleinen Batchdatei.
na dann schaun wir mal..Folgendes soll ausgeführt werden:
Suche in einer Pfadangabe inkl. Unterverzeichnissen nach allen Dateien *.* in einem bestimmten Zeitraum (Erstellungsdatum). Setze
bei allen diesen Dateien das Archivbit!
Erstellungsdatum? das ist fies in batch...Suche in einer Pfadangabe inkl. Unterverzeichnissen nach allen Dateien *.* in einem bestimmten Zeitraum (Erstellungsdatum). Setze
bei allen diesen Dateien das Archivbit!
Finde irgendwie nichts passendes. Kann mir da jemand helfen?
Wundert mich nicht, dass du nix passendes findest. Aber ich kann dir helfen.Hier mal ein Debug-entwurf (macht noch nichts):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
@Echo off
setlocal enabledelayedexpansion
set thisyear=%date:~6,4%
dir /a:-d /s /t:c>%TEMP%\archivebit.tmp
for /F "tokens=1 delims=" %%A in (%TEMP%\archivebit.tmp) do (
Echo %%A
call :getDatefromDir %%A
for /F "tokens=4 delims= " %%B in ('Echo %%A') do (
Echo %%B
)
)
:getDatefromDir
set truedate=0
set "fday="
set "fmonth="
set "fyear="
set got=%1
set fyear=%got:~6,4%
set fmonth=%got:~3,2%
set fday=%got:~0,2%
if NOT defined fday Echo FDAY not defined: %got% && set truedate=0 && goto abort
if NOT defined fmonth Echo FMONTH not defined: %got% && set truedate=0 && goto abort
if NOT defined fyear Echo FYEAR not defined: %got% && set truedate=0 && goto abort
if DEFINED fday (
if NOT "x%fday%"=="x " (
if NOT "x%fday%"=="x" (
if %fday% GEQ 0 (
if %fday% LEQ 31 (
set truedate=1
Echo DAY - check
) else (
set truedate=0
goto abort
)
) else (
set truedate=0
goto abort
)
) else (
set truedate=0
goto abort
)
)
)
if DEFINED fmonth (
if NOT "x%fmonth%"=="x " (
if NOT "x%fmonth%"=="x" (
if %fmonth% GEQ 0 (
if %fmonth% LEQ 12 (
set truedate=1
Echo MONTH - check
) else (
set truedate=0
goto abort
)
) else (
set truedate=0
goto abort
)
) else (
set truedate=0
goto abort
)
)
)
if DEFINED fyear (
if NOT "x%fyear%"=="x " (
if NOT "x%fyear%"=="x" (
if %fyear% GEQ 0 (
if %fyear% LEQ %thisyear% (
set truedate=1
Echo YEAR - check
) else (
set truedate=0
goto abort
)
) else (
set truedate=0
goto abort
)
) else (
set truedate=0
goto abort
)
)
)
goto :EOF
:abort
Echo %got%
Echo Genuine: %truedate%
pause>nul
Echo ---------------------
Echo.
goto :EOF
Ist fast fertig.
Ich hoffe doch, dein Datum ist im Format DD.MM.YYYY formatiert...
Danke und Gruß Mike
GrußSnow
Hallo zeroblue2005!
Etwa so (ungetestet):
Die Zeilen 3 und 4 sollten eigentlich selbsterklärend sein.
Wenn Du vor dem "
Grüße
bastla
[Edit]
@Snowman25: Jetzt schreibst Du so viel und bist immer noch früher fertig ...
Zur Sicherheit dem "
[/Edit]
Etwa so (ungetestet):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@echo off & setlocal
set "Basis=D:\Startordner"
set "Von=20100101"
set "Bis=20100331"
for /f "delims=" %%i in ('dir /s /b /a-d "%Basis%"') do call :ProcessFile "%%i"
goto :eof
:ProcessFile
set Erst=
for /f "tokens=1-3 delims=. " %%a in ('dir /tc %1^|findstr /i /e "%~nx1"') do set "Erst=%%c%%b%%a"
if not defined Erst (echo Erstellungsdatum fuer %1 nicht ermittelt! & goto :eof)
if %Erst% lss %Von% goto :eof
if %Erst% leq %Bis% attrib +a %1
goto :eof
Wenn Du vor dem "
attrib
" noch ein "echo
" platzierst, wird (zum Testen) der Befehl nur angezeigt, aber noch nicht ausgeführt ...Grüße
bastla
[Edit]
@Snowman25: Jetzt schreibst Du so viel und bist immer noch früher fertig ...
Ich hoffe doch, dein Datum ist im Format DD.MM.YYYY formatiert...
Der Hoffnung schließe ich mich an ...Zur Sicherheit dem "
findstr
" noch ein "/i" spendiert ...[/Edit]
Hi bastla,
möglicherweise ist meine (unfertige) Lösung etwas größer. Das liegt aber daran, dass ich 'ne getestet Validierungsroutine für das Datum drin habe, die ich so eig. überall einsetzen kann (und wohl auch werde).
Nur schaff ichs mal wieder nicht, Variablen aus der Schleife auch ausserhalb zu verwenden. Verhedder mich da jedesmal. Da gabs doch 'ne Möglichkeit dazu, oder?
Gruß
Snow
möglicherweise ist meine (unfertige) Lösung etwas größer. Das liegt aber daran, dass ich 'ne getestet Validierungsroutine für das Datum drin habe, die ich so eig. überall einsetzen kann (und wohl auch werde).
Nur schaff ichs mal wieder nicht, Variablen aus der Schleife auch ausserhalb zu verwenden. Verhedder mich da jedesmal. Da gabs doch 'ne Möglichkeit dazu, oder?
Gruß
Snow
@Snowman25
Grüße
bastla
'ne getestet Validierungsroutine für das Datum
... ist sicher eine gute Sache - ich gehe aber mal davon aus, dass noch nicht mal Windows einen 31.02. als Erstellungsdatum angibt ...Variablen aus der Schleife auch ausserhalb zu verwenden.
Was genau meinst Du damit (hatte noch nicht Zeit, mir Deinen Ansatz näher anzusehen)?Grüße
bastla
Zitat von @bastla:
@Snowman25
Das sind Einzelfälle. Die werden dann später noch extra behandelt. wie gesagt: Ist ja noch nicht fertig @Snowman25
'ne getestet Validierungsroutine für das Datum
... ist sicher eine gute Sache - ich gehe aber mal davon aus, dass noch nicht mal Windows einen 31.02. als Erstellungsdatum angibtVariablen aus der Schleife auch ausserhalb zu verwenden.
Was genau meinst Du damit (hatte noch nicht Zeit, mir Deinen Ansatz näher anzusehen)?Variablen, die in einer Schleife gesetzt wurden, gelten doch auch nur darin (Stichworte: Context, Geltungsbereich, namespace etc..).
DAS stört mich gerade..
Grüße
bastla
bastla
Grüße
Snow
@Snowman25
Könntest Du das Problem vielleicht an einem konkreten Beispiel festmachen?
Übrigens: Deine Zeilen 26 bis 46 sollten sich ohne Verlust an Funktionalität (Du unterscheidest ja nicht nach dem Grund, der das Datum ungültig macht) auch so schreiben lassen:
Auf "
Unter der Annahme, dass zweistellige Werte zu verarbeiten sind, beugt die Verwendung von "%fdayCheck%" Fehlern bei "08" und "09" vor ...
Um alle Schreibweisen abzudecken und wirklich nur Werte zwischen 1 und 31 "durchzulassen" müsste allerdings noch wesentlich mehr Aufwand getrieben werden - auch zB mit der "direkteren" Vorgangsweise
bleiben noch Fehlerquellen (wie etwa ein Wert "0A1") ...
Grüße
bastla
Variablen, die in einer Schleife gesetzt wurden, gelten doch auch nur darin
Das kann ich nun beim besten Willen nicht nachvollziehen - zumeist ist es genau entgegengesetzt: Variablen, die in einer Schleife gesetzt wurden, können nur unter Verwendung von "delayedExpansion" auch gleich in der Schleife verwendet werden ...Könntest Du das Problem vielleicht an einem konkreten Beispiel festmachen?
Übrigens: Deine Zeilen 26 bis 46 sollten sich ohne Verlust an Funktionalität (Du unterscheidest ja nicht nach dem Grund, der das Datum ungültig macht) auch so schreiben lassen:
1
2
3
4
2
3
4
set /a "fdayCheck=1%fday%"
set "truedate=0"
if %fdayCheck% GEQ 101 if %fdayCheck% LEQ 131 set "truedate=1"
if %truedate%==1 (Echo DAY - check) else (goto abort)
defined
" hast Du schon in Zeile 22 geprüft, was die Abfragen in den Zeilen 26 und 28 obsolet macht.Unter der Annahme, dass zweistellige Werte zu verarbeiten sind, beugt die Verwendung von "%fdayCheck%" Fehlern bei "08" und "09" vor ...
Um alle Schreibweisen abzudecken und wirklich nur Werte zwischen 1 und 31 "durchzulassen" müsste allerdings noch wesentlich mehr Aufwand getrieben werden - auch zB mit der "direkteren" Vorgangsweise
1
2
3
4
5
6
2
3
4
5
6
if "%fday%"=="08" set "fday=8"
if "%fday%"=="09" set "fday=9"
set /a fdayCheck=%fday%
set "truedate=0"
if %fdayCheck% GEQ 1 if %fdayCheck% LEQ 31 set "truedate=1"
if %truedate%==1 (Echo DAY - check) else (goto abort)
Grüße
bastla