zeroblue2005
Goto Top

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

Content-Key: 140911

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

Printed on: April 25, 2024 at 14:04 o'clock

Member: Snowman25
Snowman25 Apr 19, 2010 at 10:07:31 (UTC)
Goto Top
Zitat von @zeroblue2005:
Hallo Zusammen,
Hallo @zeroblue2005,

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

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):
@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
Member: bastla
bastla Apr 19, 2010 at 10:10:08 (UTC)
Goto Top
Hallo zeroblue2005!

Etwa so (ungetestet):
@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
Die Zeilen 3 und 4 sollten eigentlich selbsterklärend sein.

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 ... face-wink
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]
Member: Snowman25
Snowman25 Apr 19, 2010 at 10:22:40 (UTC)
Goto Top
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
Member: zeroblue2005
zeroblue2005 Apr 19, 2010 at 10:23:58 (UTC)
Goto Top
Danke erst mal an euch beide face-smile Ich versuche es später mal, da im Monment bei uns hier ein wenig brennt.

Vielen Dank noch mal!!!!
Member: bastla
bastla Apr 19, 2010 at 10:29:10 (UTC)
Goto Top
@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 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
Member: Snowman25
Snowman25 Apr 19, 2010 at 10:38:29 (UTC)
Goto Top
Zitat von @bastla:
@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 angibt
Das sind Einzelfälle. Die werden dann später noch extra behandelt. wie gesagt: Ist ja noch nicht fertig face-smile

Variablen 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

Grüße
Snow
Member: bastla
bastla Apr 19, 2010 at 13:21:27 (UTC)
Goto Top
@Snowman25
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:
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)
Auf "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
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)
bleiben noch Fehlerquellen (wie etwa ein Wert "0A1") ...

Grüße
bastla
Member: zeroblue2005
zeroblue2005 Apr 20, 2010 at 08:44:15 (UTC)
Goto Top
Hallo Ihr beiden, also habe das jetzt getestet und läuft super vielen Dank noch mal face-smile