sinixnd
Goto Top

Verzwickter Datumsvergleich in Batch

hi, ich bin neu hier im forum und da es mir schon des öfteren weitergeholfen hat, hoffe ich dass dies auch diesmal der fall sein wird ;)

 @echo off & setlocal 
cls

::=========================================================================================================================
set "dtdelims=.: "  

echo Zieldatum eingeben (Datum, bis zu dem alles gelöscht werden soll in folgender Form: TT.MM.JJJJ)
set /p Zieldatum=
set Zieldatum=%Zieldatum:~6,4%%Zieldatum:~3,2%%Zieldatum:~0,2%
cls

echo Dateityp der zu löschenden Dateien eingeben (In dieser Form OHNE PUNKT: exe)
set /p Zieldateityp=
cls

::=========================================================================================================================
::Pushd C:\Windows\Winsxs


:Lblfail

for /f %%i in ('dir /b /A-d *.%Zieldateityp%') do echo 1 %%i & pause nul & (  
for /f "tokens=1-3 delims=%dtdelims%" %%a in ("%%~ti") do echo 2 %%a & pause nul & (  
If /I [%%c%%b%%a]LEQ[%Zieldatum%] echo %%c%%b%%a & echo %Zieldatum% & pause nul & del %%~fi  

  ) 
 ) 

goto :eof 

Hallo ihr ;)

zunächst geht es um obiges Skript....
Es soll alle Dateien des Typs *.%Zieldateityp% die älter als %Zieldatum% sind, löschen... es funktioniert alles, bis zu dem Label :Lblfail


Der Fehler liegt also in den folgenden drei zeilen.. lasst euch bitte nicht durch die vielen echos und pause befehle stören dafür habe ich unterhalb das selbe skript (einen ausschnitt) ohne diese Kontrollbefehle, wie ich sie gerne verwende...


 for /f %%i in ('dir /b /A-d *.%Zieldateityp%') do  (  
for /f "tokens=1-3 delims=%dtdelims%" %%a in ("%%~ti") do (  
If /I [%%c%%b%%a]LEQ[%Zieldatum%] del %%~fi  

 ) 
 ) 

goto :eof 

Ich weiß wirklich nicht mehr weiter... hoffe es is nicht allzu schwierig... aja.. sobald das Programm am :Lblfail ankommt, wird es einfach beendet (etwaige Meldungen sind zu kurz angezeigt, um sie lesen zu können)

Hoffe ihr könnt mir helfen

MfG

fame.styler

Content-Key: 164837

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

Ausgedruckt am: 28.03.2024 um 08:03 Uhr

Mitglied: bastla
bastla 18.04.2011 um 23:08:19 Uhr
Goto Top
Hallo fame.styler und willkommen im Forum!

Zu
etwaige Meldungen sind zu kurz angezeigt, um sie lesen zu können
Wenn Du aus "echo off" ein "echo on" machst, verbessert das Deine Chancen [Edit] wenn Du, was Du eigentlich immer tun solltst, direkt in der CMD-Shell testest [/Edit] ...

... allerdings sollte es schon genügen, vor und nach "LEQ" ein Leerzeichen einzubauen.

Grüße
bastla

P.S.: Wenn Du öfters Batchschnipsel posten (oder Deinen Einstandsbeitrag noch etwas ansehnlicher gestallten) willst:
Mitglied: 60730
60730 18.04.2011, aktualisiert am 18.10.2012 um 18:46:32 Uhr
Goto Top
moin und willkommen...

aja.. sobald das Programm am :Lblfail ankommt, wird es einfach beendet (etwaige Meldungen sind zu kurz angezeigt, um sie lesen zu können)
liegt ganz sicher am und das du die Batch doppelklickst.


Gruß
Mitglied: 99045
99045 18.04.2011 um 23:25:01 Uhr
Goto Top
n'Abend und Willkommen.

Setze doch bitte deinen Code in Code Tags, das lliest sich besser face-smile
< code> < /code> (ohne Leerzeichen).

Dann sieh dir bitte in der Konsole mal die Hilfe zu set an: Set /?
Mit set /P kannst du gleich einen Text eingeben, und wenn du das Ganze in Anführungszeichen setzt, ist vielleicht auch der Datumsfehler weg?

set /p "Zieldatum=Zieldatum eingeben(Datum, bis zu dem alles gelöscht werden soll in folgender Form: TT.MM.JJJJ) "

und die Formatierung der Variablen kannst du dir dann auch sparen.

Zu Pushd gehört am Ende auch Popd face-smile Es könnte ja sein, dass du die Sprungmarke, die du zwar gesetzt hast, aber nirgendwo anspringst, auch mehrfach verwendest, dann läuft irgendwann dein Stack über, wenn du popd nicht einsetzt.

Gruß
Mitglied: bastla
bastla 18.04.2011 um 23:28:16 Uhr
Goto Top
@99045
Ob die Form "TT.MM.JJJJ" sich wirklich so gut für einen Vergleich per "LEQ" eignet ... face-wink

Grüße
bastla
Mitglied: 99045
99045 18.04.2011 um 23:29:57 Uhr
Goto Top
So weit war ich noch gar nicht. Es ging mir nur um die Verwendung von set /p :-P
Das Gewurschtel dahinter würde ich gerne in fixem Zeichenabstand lesen. face-smile
Mitglied: bastla
bastla 18.04.2011 um 23:35:19 Uhr
Goto Top
@99045
So weit war ich noch gar nicht.
Na immerhin hast Du bereits das fehlende (auskommentierte?) "popd" zum auskommentierten "pushd" bemerkt ...

Grüße
bastla
Mitglied: SinixND
SinixND 19.04.2011 um 07:00:33 Uhr
Goto Top
also erstmal danke für die vielen antworten

das pushd kommt daher, dass ich dass skirpt teilweise ausm internet habe ;)
kann ich es einfach mit CD ersetzen?

und @bastla: Die form TT.MM.JJJJ is ja nur die eingabe... sie wird später noch umgestellt ;) (kleine spielerei xD)

ansonsten werde ich heute nachmittag mal eure tipps befolgen und das skript nochmal überarbeiten...

melde mich wieder


Bis dann

fame.styler
Mitglied: bastla
bastla 19.04.2011 um 09:51:28 Uhr
Goto Top
Hallo fame.styler!
Die form TT.MM.JJJJ is ja nur die eingabe... sie wird später noch umgestellt ;) (kleine spielerei xD)
Ist ja auch erforderlich, und mein Hinweis hatte sich eigentlich nicht auf die Eingabe, sondern auf Kaputtnicks
und die Formatierung der Variablen kannst du dir dann auch sparen.
bezogen.
Gegen "pushd" ist übrigens gar nix zu sagen - nur ist eben auch "popd" als "Gegenstück" zu verwenden ...

Grüße
bastla

P.S.: Das Editieren auch eines Eröffnungsbeitrages ist problemlos möglich (um etwa doch noch eine passende Formatierung für den geposteten Code zu verwenden) ... face-wink
Mitglied: 99045
99045 19.04.2011 um 09:58:24 Uhr
Goto Top
@bastla

Hi,
um das mal klarzustellen: Die Formatierung könnte man sich sparen, wenn man das Datum gleich im benötigten Format eingibt, z. B. JJJJMMTT, dann könnte man bei entsprechender Änderung des Codes und Verwendung einer Subroutine sehr wohl auch LEQ nutzen. face-smile

Mir ging es nur um die Verwendung von set /p mit dem entsprechenden Text, ob der richtig oder falsch war, war mir erst mal völlig schnurz. face-smile

Gruß
Mitglied: Skyemugen
Skyemugen 19.04.2011 um 10:58:27 Uhr
Goto Top
Zitat von @bastla:
Gegen "pushd" ist übrigens gar nix zu sagen - nur ist eben auch "popd" als "Gegenstück" zu verwenden ...

Aloha bastla!

Ich denke aber, man sollte ihm wirklich noch einmal auf deinen Kommentar
Zitat von @bastla:
auskommentierten "pushd"
hinweisen, bzw.

@fame.styler
::Pushd C:\Windows\Winsxs
== nutzlos und nichts anderes bewirkend als ein REM in diesem Fall ...
Wenn du also möchtest, dass in dieses Verzeichnis gesprungen wird, solltest du die Doppelpunkte entfernen (das meint bastla mit auskommentiert), sonst gibt's kein dir nach Maß

greetz André
Mitglied: SinixND
SinixND 19.04.2011 um 22:38:02 Uhr
Goto Top
ach so ja selbst verständlich ^^ dass habe ich nur gemacht weil ich es in einem testverzeichnis laufen habe lassen, und mir der sprung in dem fall eher hinderlich war ;) (hätte ich dazusagen sollen, sorry =D)

bin heute leider nicht mehr dazu gekommen es durchzuschaun (skript) werde dass aber so bald als möglich nachholen ;)

und danke nochmal für die viele hilfe ;)

[Edit] Alles klar, es war tatsächlich nur die Leerstelle falsch ;D danach hat alles super funktioniert ;) VIELEN DANK EUCH ALLEN =)
Gibt es eigentlich eine allgemeine Regel, wann Leerzeichen eine Rolle Spielen und wann nicht??? [/Edit]
Mitglied: SinixND
SinixND 20.04.2011 um 21:08:46 Uhr
Goto Top
ach genau. und noch was..... wie lasse ich das ganze in allen unterordnern machen? kann ich da einfach aus For /f ein For /r /f machen?
Mitglied: bastla
bastla 20.04.2011 um 21:12:31 Uhr
Goto Top
Hallo fame.styler!
kann ich da einfach aus For /f ein For /r /f machen?
Eher aus dem "dir /b" ein "dir /b /s" ...

Grüße
bastla
Mitglied: Biber
Biber 20.04.2011 um 21:20:19 Uhr
Goto Top
[OT] @bastla
Zitat von @bastla:
> kann ich da einfach aus For /f ein For /r /f machen?
Eher aus dem "dir /b" ein "dir /b /s" ...
Wenn meine Omma in der Warteschlange an der Supermarktkasse steht und die beiden Kunden vor ihr führen diesen Dialog....


-> Die haut mit der Handtasche drauf!


Und da hab ich Verständnis für. *gg

Grüße
Biber
[OT]
Mitglied: SinixND
SinixND 20.04.2011 um 21:28:20 Uhr
Goto Top
aja... daran hatte ich nich gedacht ^^ aber angenommen ich hätte kein DIR.... wie dann?
Mitglied: bastla
bastla 20.04.2011 um 21:30:03 Uhr
Goto Top
[OT] @Biber
-> Die haut mit der Handtasche drauf!
Ist denn Deine Omma auch eine dieser heißblütigen Bremerinnen? face-wink

Grüße
bastla
[/OT]
Mitglied: bastla
bastla 20.04.2011 um 21:34:16 Uhr
Goto Top
Hallo fame.style!
aber angenommen ich hätte kein DIR.... wie dann?
Dann hättest Du auch kein "for /f" ... face-wink

... sondern tatsächlich ein "for /r".
In Zeile 3 (bzw 24) brauchst Du übrigens kein "%%~fi" - das Eingesparte würde ich aber in Anführungszeichen investieren ...

Grüße
bastla
Mitglied: Biber
Biber 20.04.2011 um 21:47:32 Uhr
Goto Top
Moin fame.styler,

vielleicht hilft diese Demo am CMD-Prompt..
>for /r "f:\temp" %i in (*.txt) do @for /f "tokens=1-3 delims=. " %a in ("%~ti") do @echo i[%i] ~ti[%~ti] [IF %c%b%a LEQ 20100101...]
i[f:\temp\übersicht.sql.txt] ~ti[23.02.2010 14:41] [IF 20100223 LEQ 20100101...]
i[f:\temp\readmes\readme_de.txt] ~ti[27.04.2009 06:23] [IF 20090427 LEQ 20100101...]
i[f:\temp\licenses\license_de.txt] ~ti[27.04.2009 06:23] [IF 20090427 LEQ 20100101...]

Ich lasse hier [willkürlich] eine FOR /R Anweisung über ein Verzeichnis F:\temp und dort über alle *.txt drüberschrapeln.
Dahinter ist deine FOR /F -Anweisung sinngemäß hintenangestellt.

Die von bastla zu Recht empfohlenen Anführungszeichen würden hierzu führen:
>for /r "f:\temp" %i in (*.txt) do @for /f "tokens=1-3 delims=. " %a in ("%~ti") do @echo i["%i"] ~ti[%~ti] [IF %c%b%a LEG 20100101...]
i["f:\temp\übersicht.sql.txt"] ~ti[23.02.2010 14:41] [IF 20100223 LEG 20100101...]
i["f:\temp\readmes\readme_de.txt"] ~ti[27.04.2009 06:23] [IF 20090427 LEG 20100101...]
i["f:\temp\licenses\license_de.txt"] ~ti[27.04.2009 06:23] [IF 20090427 LEG 20100101...]
--> Somit würden auch Pfade und/oder Dateinamen mit Leerzeichen richtig verarbeitet.

Grüße
Biber

[Edit] @fame.steiler
Du brauchst nur die jeweils erste Zeile (beginnend mit ">", der mein Prompt ist und NICHT eingegeben werden muss) verstehen.
Der Rest ist Ausgabe.
[/Edit]
Mitglied: SinixND
SinixND 20.04.2011 um 21:49:43 Uhr
Goto Top
ouh weia.... na da brauch ich n bisschen biss ich das skript durchschaut hab

@bastla... es funktioniert nicht
kann dir aber auch den Grund sagen: der letzte Ordner heißt "Neuer Ordner" und da hat er ein Problem mit..... reicht es da das ~f wegzulassen, was du ja schon erwähnt hast?

Edit: Was macht das @ vor der/meiner For-Schleife?? und ist das von dir jetzt ein Skript oder eine Ausgabe??? (Bieber)
Mitglied: SinixND
SinixND 20.04.2011 um 21:56:22 Uhr
Goto Top
ich glaub ich steig nich durch....
Edit: Etz habes checkt ^^
Edit2: Also des mit den Ausrufezeichen die des ~f ersetzen habe entweder ned checkt oda es funktioniert immer noch nich... ich post mal zur sicherheit des skript nommal

@echo on & setlocal 
cls
::=========================================================================================================================
set "dtdelims=.: "  

echo Zieldatum eingeben (Datum, bis zu dem alles gelöscht werden soll in folgender Form: TT.MM.JJJJ)
::set /p Zieldatum=
set Zieldatum=16.04.2011
set Zieldatum=%Zieldatum:~6,4%%Zieldatum:~3,2%%Zieldatum:~0,2%
cls

echo Dateityp der zu löschenden Dateien eingeben (In dieser Form OHNE PUNKT: exe)
::set /p Zieldateityp=
set Zieldateityp=jpg
cls

::=========================================================================================================================
::Pushd C:\Windows\Winsxs

for /f %%i in ('dir /b /s /A-d *.%Zieldateityp%') do (  
for /f "tokens=1-3 delims=%dtdelims%" %%a in ("%%~ti") do (  
If /I [%%c%%b%%a] LEQ [%Zieldatum%] del "%%i"    

  ) 
  ) 

pause > nul

goto :eof

Die Pause am Schluss is dazu da, damit ich mir alles nommal durchlesen kann und am anfang habe die Sets auskommentiert, weil ich ned bei jedem Testversuch die gleichen Daten eintippen wollt ;)

Plus der ausgabe des Befehls am Schluss:

<for /f "tokens=1-3 delims=.: " %a in ("") do (If [%c%b%a] LEQ [20110416] del "%Userprofile%\Desktop\Fabrik\Neuer" ) )

also entweder es liegt an dem %a in ("") das des leer is oder
an dem "Userprofile\Desktop\Fabrik\Neuer"
Mitglied: Biber
Biber 21.04.2011 um 08:56:02 Uhr
Goto Top
Moin foen.styler,


Zitat von @SinixND:
Edit: Was macht das @ vor der/meiner For-Schleife?? und ist das von dir jetzt ein Skript oder eine Ausgabe??? (Bieber)

Also. es gibt ZWEI mehr oder weniger erwähnenswerte Bi(e)ber.
Einen mit "ie" geschriebenen und ohne Haare auf der Brust und Weichspüler im Blick und Vornamen Justin.

Und einen anderen ohne "ie". Und ohne den Weichspülkrams.

Und da ich glaube für Justin sprechen zu können: Bitte verwechsele uns nicht.

Was macht das @ vor der/meiner For-Schleife??
Das unterdrückt nur ein "ECHO" des nachfolgenden Befehls.
Direkter Vergleich am CMD-Prompt von "for" und "@for" bei der zweiten FOR_Anweisung.
>for /r "f:\temp" %i in (*.txt) do for /f "tokens=1-3 delims=. " %a in ("%~ti") do @echo i["%i"] ~ti[%~ti] [IF %c%b%a LEG 20100101...]

(= 8:51:01  D:\temp=)
>for /F "tokens=1-3 delims=. " %a in ("23.02.2010 14:41") do @echo i["f:\temp\übersicht.sql.txt"] ~ti[23.02.2010 14:41] [IF %c%b%a LEG 20100101...]
i["f:\temp\übersicht.sql.txt"] ~ti[23.02.2010 14:41] [IF 20100223 LEG 20100101...]

(= 8:51:01  D:\temp=)
>for /F "tokens=1-3 delims=. " %a in ("27.04.2009 06:23") do @echo i["f:\temp\readmes\readme_de.txt"] ~ti[27.04.2009 06:23] [IF %c%b%a LEG 20100101...]
i["f:\temp\readmes\readme_de.txt"] ~ti[27.04.2009 06:23] [IF 20090427 LEG 20100101...]

(= 8:51:01  D:\temp=)
>for /F "tokens=1-3 delims=. " %a in ("27.04.2009 06:23") do @echo i["f:\temp\licenses\license_de.txt"] ~ti[27.04.2009 06:23] [IF %c%b%a LEG 20100101...]
i["f:\temp\licenses\license_de.txt"] ~ti[27.04.2009 06:23] [IF 20090427 LEG 20100101...]

(= 8:51:01  D:\temp=)
>for /r "f:\temp" %i in (*.txt) do @for /f "tokens=1-3 delims=. " %a in ("%~ti") do @echo i["%i"] ~ti[%~ti] [IF %c%b%a LEG 20100101...]
i["f:\temp\übersicht.sql.txt"] ~ti[23.02.2010 14:41] [IF 20100223 LEG 20100101...]
i["f:\temp\readmes\readme_de.txt"] ~ti[27.04.2009 06:23] [IF 20090427 LEG 20100101...]
i["f:\temp\licenses\license_de.txt"] ~ti[27.04.2009 06:23] [IF 20090427 LEG 20100101...]

Abgeschickt habe ich (was hier nicht so schön zu erkennen ist) die allererste Zeile in dem Code-Kästchen und die viertletzte.
Alles andere sind Ausgaben, die auf den bildschirm zurückgegeben werden.

Dasselbe Verhalten von "@" gilt weiter hinten für das "@echo" - auch hier würde sonst das "Echo des auszuführenden Befehls" auf den Bildschirm kommen.
und ist das von dir jetzt ein Skript oder eine Ausgabe???
Ja. Nee. Keines. Ist eine Testzeile (neudeutsch: POC =proof-of-concept) direkt am CMD-Prompt ausgeführt.

Grüße
Biber (NEQ Justin)
Mitglied: Skyemugen
Skyemugen 21.04.2011 um 08:59:12 Uhr
Goto Top
[OT]
Zitat von @Biber:
Also. es gibt ZWEI mehr oder weniger erwähnenswerte Bi(e)ber.
Einen mit "ie" geschriebenen und ohne Haare auf der Brust und Weichspüler im Blick und Vornamen Justin.
Da kennt sich aber jemand aus ^_^ wohl ein heimlicher Fan, huh?
[/OT]
Mitglied: Biber
Biber 21.04.2011 um 09:05:32 Uhr
Goto Top
[OT] @Skyemugen
Zitat von @Skyemugen:
[OT]
> Zitat von @Biber:
> ----
> Also. es gibt ZWEI mehr oder weniger erwähnenswerte Bi(e)ber.
> Einen mit "ie" geschriebenen und ohne Haare auf der Brust und Weichspüler im Blick und Vornamen Justin.
Da kennt sich aber jemand aus ^_^ wohl ein heimlicher Fan, huh?
[/OT]
Kennst du die Redewendung "Eher spring ich lachend in die Kreissäge." ?
ist zwar keine Bremensie, würde aber hier passen. face-wink

Grüße
Biber
[/OT]
Mitglied: bastla
bastla 21.04.2011 um 10:17:06 Uhr
Goto Top
Hallo fame.styler!

Wird's besser, wenn Du
for /f "delims=" %%i in ('dir /b /s /A-d *.%Zieldateityp%') do (
verwendest?
Also des mit den Ausrufezeichen die des ~f ersetzen habe entweder ned checkt oda es funktioniert immer noch nich
Mach einfach Anführungszeichen (oder "Zoll"-Zeichen, wie Skyemugen gerne dazu sagt) draus ... face-wink

Grüße
bastla
Mitglied: SinixND
SinixND 21.04.2011 um 21:36:40 Uhr
Goto Top
aber WAS soll ich zu anführungszeichen machen xD

aja, und das "delims=" hat gwirkt, aber mal so ne verständnisfrage, wenn ich "delims=" leer lasse, dann setze ich quasi die vorher definierten delims außer kraft, oda was? und deswegen kümmern ihn dann die leerzeichen im ordnernamen nicht mehr, hab ich recht?
Mitglied: bastla
bastla 21.04.2011 um 21:43:00 Uhr
Goto Top
Hallo fame.styler!

Haben wir doch ohnehin schon längst - anstelle von
%%~fi
sollst Du
"%%i"
verwenden (da dadurch - ebenso wie durch das oben der "for /f"-Schleife hinzugefügte "delims=" - auch enthaltene Leerzeichen den Pfad / Dateinamen nicht "zerreißen") ...

Grüße
bastla
Mitglied: SinixND
SinixND 22.04.2011 um 12:05:06 Uhr
Goto Top
alles klar, jetzt hab ichs verstanden..
danke nochmals allen, die mir in diesem Beitrag geholfen haben ;)