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 ;)
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...
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
@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
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 164837
Url: https://administrator.de/forum/verzwickter-datumsvergleich-in-batch-164837.html
Ausgedruckt am: 22.12.2024 um 03:12 Uhr
27 Kommentare
Neuester Kommentar
Hallo fame.styler und willkommen im Forum!
Zu
... allerdings sollte es schon genügen, vor und nach "
Grüße
bastla
P.S.: Wenn Du öfters Batchschnipsel posten (oder Deinen Einstandsbeitrag noch etwas ansehnlicher gestallten) willst:
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:
moin und willkommen...
Gruß
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ß
n'Abend und Willkommen.
Setze doch bitte deinen Code in Code Tags, das lliest sich besser
< 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?
und die Formatierung der Variablen kannst du dir dann auch sparen.
Zu Pushd gehört am Ende auch Popd 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ß
Setze doch bitte deinen Code in Code Tags, das lliest sich besser
< 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 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ß
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.
Das Gewurschtel dahinter würde ich gerne in fixem Zeichenabstand lesen.
Hallo fame.styler!
Gegen "
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) ...
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 Kaputtnicksund 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) ...
@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.
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.
Gruß
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.
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.
Gruß
Zitat von @bastla:
Gegen "
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
hinweisen, bzw.
@fame.styler
::Pushd C:\Windows\Winsxs
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é
[OT] @bastla
-> Die haut mit der Handtasche drauf!
Und da hab ich Verständnis für. *gg
Grüße
Biber
[OT]
Zitat von @bastla:
> kann ich da einfach aus For /f ein For /r /f machen?
Eher aus dem "
Wenn meine Omma in der Warteschlange an der Supermarktkasse steht und die beiden Kunden vor ihr führen diesen Dialog....> kann ich da einfach aus For /f ein For /r /f machen?
Eher aus dem "
dir /b
" ein "dir /b /s
" ...-> Die haut mit der Handtasche drauf!
Und da hab ich Verständnis für. *gg
Grüße
Biber
[OT]
[OT] @Biber
Grüße
bastla
[/OT]
-> Die haut mit der Handtasche drauf!
Ist denn Deine Omma auch eine dieser heißblütigen Bremerinnen? Grüße
bastla
[/OT]
Moin fame.styler,
vielleicht hilft diese Demo am CMD-Prompt..
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:
--> 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]
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...]
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]
Moin foen.styler,
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.
Direkter Vergleich am CMD-Prompt von "for" und "@for" bei der zweiten FOR_Anweisung.
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.
Grüße
Biber (NEQ Justin)
Zitat von @SinixND:
Edit: Was macht das @ vor der/meiner For-Schleife?? und ist das von dir jetzt ein Skript oder eine Ausgabe??? (Bieber)
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)
[OT]
[/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?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.
[/OT]
[OT] @Skyemugen
ist zwar keine Bremensie, würde aber hier passen.
Grüße
Biber
[/OT]
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." ?[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]
ist zwar keine Bremensie, würde aber hier passen.
Grüße
Biber
[/OT]
Hallo fame.styler!
Wird's besser, wenn Du
verwendest?
Grüße
bastla
Wird's besser, wenn Du
for /f "delims=" %%i in ('dir /b /s /A-d *.%Zieldateityp%') do (
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 ... Grüße
bastla