Jahr aus Datum extrahieren 2 Stellig
Will in einer Variable das Jahr 2-Stellig haben
Hi Leute,
Hab mir unlängst eine Batch Datei gebaut die mir Variablen mit diversen Datumswerten füllt.
Klappt auch ganz super.
Nun brauche ich für eine neue Routine das Jahr aber 2 Stellig und nicht wie hier:
4 Stellig.
Kann mir jemand einen Tip geben wie das funktioniert hat?
Hi Leute,
Hab mir unlängst eine Batch Datei gebaut die mir Variablen mit diversen Datumswerten füllt.
Klappt auch ganz super.
Nun brauche ich für eine neue Routine das Jahr aber 2 Stellig und nicht wie hier:
for /f "tokens=1-6 delims=:.," %%a in ("%date%") do @set Jahr=%%c
Kann mir jemand einen Tip geben wie das funktioniert hat?
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 88813
Url: https://administrator.de/contentid/88813
Ausgedruckt am: 25.11.2024 um 14:11 Uhr
17 Kommentare
Neuester Kommentar
Hallo pbelcl!
Bibers unten (siehe "Mögliche Anleitungen zu dem Thema:") verlinkten Workshop hast Du Dir ja sicher schon angesehen ...
Für Datumsberechnungen/-auswertungen greife ich, wenn möglich, auf (in Batch integriertes) VBS zurück - das sähe (als Demo für den morgigen Tag) so aus:
Ergebnis:
Je nach gewünschter Schreibweise kannst Du ein oder mehrere "tokens" (im Beispiel "%%f" für "ausgeschriebenen Wochentag") herausgreifen oder auch das VBScript nach Bedarf kürzen - um etwa nur Monat und Wochentag ausgeschrieben zu erhalten, sähe die Zeile 5 dann so aus:
Grüße
bastla
Bibers unten (siehe "Mögliche Anleitungen zu dem Thema:") verlinkten Workshop hast Du Dir ja sicher schon angesehen ...
Für Datumsberechnungen/-auswertungen greife ich, wenn möglich, auf (in Batch integriertes) VBS zurück - das sähe (als Demo für den morgigen Tag) so aus:
@echo off & setlocal
set "Datum=1.6.2008"
set D=%temp%\DatZerleg.vbs
echo D=WScript.Arguments(0):WScript.Echo Year(D)^&";"^&Month(D)^&";"^&Day(D)^&";"^&MonthName(Month(D))^&";"^&MonthName(Month(D),True)^&";"^&WeekDayName(Weekday(D))^&";"^&WeekDayName(Weekday(D),True)>%D%
echo Teilinformationen zu %Datum%:
cscript //nologo %D% %Datum%
for /f "tokens=1-7 delims=;" %%a in ('cscript //nologo %D% %Datum%') do set "Mon=%%d" & set "WoTag=%%f"
echo Monatsname: %Mon%
echo Wochentag: %WoTag%
Teilinformationen zu 1.6.2008:
2008;6;1;Juni;Jun;Sonntag;So
Monatsname: Juni
Wochentag: Sonntag
echo D=WScript.Arguments(0):WScript.Echo MonthName(Month(D))^&";"^&WeekDayName(Weekday(D))>%D%
bastla
Hallo pbelcl!
Grüße
bastla
Deine Anleitung klingt noch komplizierter, als meine bisherigen "Fundstücke".
Nur interessehalber: Hast Du den Batch überhaupt getestet, denn eigentlich kannst Du das Beispiel (ich habe jetzt noch eine Zeile für den Monatsnamen ergänzt) 1:1 übernehmen (bzw die "echo"-Zeilen - außer Zeile 5 - natürlich weglassen) ...Sorry aber mit VB hab ich nicht viel am Hut, daher versteh ich vielleicht noch nicht ganz was Du mir da zusammengestellt hast.
Musst Du auch nicht - der Batch erstellt das Script, und das Script liefert dem Batch die Teilinformationen, die Du dann unter %%a (=Jahr) bis %%g (=Wochentag abgekürzt) in der "for"-Zeile zur Verfügung hast.Grüße
bastla
Moin pbelcl,
nur ein kurzer Zwischenruf von mir zur
Frage 2) "Kann ich nicht auch den VBS-Schnipsel dauerhaft im Pfad speichern...
Antwort:
Ja. Geht auch schneller als ihn jedesmal zu erzeugen und wieder zu löschen.
Und Nein: Denn es ist ein One-Trick-Utilitiy. Ohne Hilfe, ohne Parameterprüfung, ohne Chance eines Auf-den-ersten-Blick-im-Code-sehen-was-passiert.
Sprich: Wenn Du aus Versehen mal einen Winzschnipsel mit einem Namens "DatZerleg.vbs" aufrufst passiert irgendetwas Sinnvolles, wenn der Aufrufer weiß, was er tut und die richtigen In- und Output-Parameter kennt. Sonst nur Unsinn.
=> Fazit: Ich würde in einem "D:\Tools" oder "E:\Utilities"-Verzeichnis wirklich nur mehrfach verwendbare Tools mit Fehlerbehandlung und eingebauter Hilfe zulassen.
Alles, was wirklich Hilfsroutinen sind, die nur "intern" in einem anderen Batch genutzt werden, sollten temporär bleiben.
Grüße
Biber
nur ein kurzer Zwischenruf von mir zur
Frage 2) "Kann ich nicht auch den VBS-Schnipsel dauerhaft im Pfad speichern...
Antwort:
Ja. Geht auch schneller als ihn jedesmal zu erzeugen und wieder zu löschen.
Und Nein: Denn es ist ein One-Trick-Utilitiy. Ohne Hilfe, ohne Parameterprüfung, ohne Chance eines Auf-den-ersten-Blick-im-Code-sehen-was-passiert.
Sprich: Wenn Du aus Versehen mal einen Winzschnipsel mit einem Namens "DatZerleg.vbs" aufrufst passiert irgendetwas Sinnvolles, wenn der Aufrufer weiß, was er tut und die richtigen In- und Output-Parameter kennt. Sonst nur Unsinn.
=> Fazit: Ich würde in einem "D:\Tools" oder "E:\Utilities"-Verzeichnis wirklich nur mehrfach verwendbare Tools mit Fehlerbehandlung und eingebauter Hilfe zulassen.
Alles, was wirklich Hilfsroutinen sind, die nur "intern" in einem anderen Batch genutzt werden, sollten temporär bleiben.
Grüße
Biber
Hallo pbelcl!
Zu 2) hat Biber eigentlich alles Nötige gesagt, daher: Lass weiterhin den Batch das Script erzeugen - auf die 2 Zeilen sollte es nicht ankommen ...
Einfacher wird die Syntax übrigens dadurch auch nicht - diese hängt nur davon ab, was das Script liefern soll.
Zu 1) Fast: Vermeide in Batch generell all nicht benötigten Leerzeichen, demnach:
Die Variable %Datum% sollte nur für etwas mehr Flexibilität sorgen - Du könntest daher tatsächlich ganz darauf verzichten und %DATE% beim Aufruf des Scripts direkt verwenden:
Grüße
bastla
P.S.: Wenn Du in Deinem Scripting-Versuch an den Anfang der Zeile 1 noch ein "D=" (ohne Anführungszeichen) stellst und in Zeile 2 alle "^" ersatzlos streichst, könnte es was werden ...
Zu 2) hat Biber eigentlich alles Nötige gesagt, daher: Lass weiterhin den Batch das Script erzeugen - auf die 2 Zeilen sollte es nicht ankommen ...
Einfacher wird die Syntax übrigens dadurch auch nicht - diese hängt nur davon ab, was das Script liefern soll.
Zu 1) Fast: Vermeide in Batch generell all nicht benötigten Leerzeichen, demnach:
set Datum=%DATE%
for /f "tokens=1-7 delims=;" %%a in ('cscript //nologo %D% %DATE%') do set "Mon=%%d" & set "WoTag=%%f"
bastla
P.S.: Wenn Du in Deinem Scripting-Versuch an den Anfang der Zeile 1 noch ein "D=" (ohne Anführungszeichen) stellst und in Zeile 2 alle "^" ersatzlos streichst, könnte es was werden ...
Moin bastla,
Das stimmt unter Umständen so nicht.
pbelcl hatte sich eine Batch geschrieben, die so aussah (s.o.):
Diese würde auch funktionieren, wenn das Datum so aussieht:
Auf Deinen letzten Schnipsel angewendet allerdings...
wäre nun das ausgewertete WScript.argument(0) gleich dem String "So" und das Datum "01.06.2008" als Argument(1) würde ins Leere laufen.
Deshalb würde ich (mit ganz konservativer Risikobereitschaft) hier sehr wohl eine Variable %Datum% (o.ä.) verwenden, die entweder die letzten 10 Stellen von %date% oder das letzte Token von 5%date% nimmt.
wenn "%date%"="01.06.2008" -->"%date:~-10%"="01.06.2008"
wenn "%date%"="So. 01.06.2008" -->"%date:~-10%"="01.06.2008"
-oder-
@pbelcl: Mag sich nach Haarspalterei anhören, aber wenn Dein Schnipsel evtl. mal auf verschiedenen Rechnern und verschiedenen Win-Versionen kaufen können soll, dann musst Du solchen Unsicherheiten umgehen.
Und deshalb sind die Prioriäten beim Coden eben "Lesbar, Wartbar, Erweiterbar,..." und irgendwo an Stelle 5 oder 6 meinetwegen "kompakt" und "so kurz wie möglich". Aber nicht an Stelle 1.
Grüße
Biber
Die Variable %Datum% sollte nur für etwas mehr Flexibilität sorgen - Du könntest daher tatsächlich ganz darauf verzichten und %DATE% beim Aufruf des Scripts direkt verwenden:
Das stimmt unter Umständen so nicht.
pbelcl hatte sich eine Batch geschrieben, die so aussah (s.o.):
for /f "tokens=1-6 delims=:.," %%a in ("%date%") do @set Jahr=%%c
>echo %date%
So 01.06.2008
>for /f "tokens=1-6 delims=:.," %a in ("%date%") do @echo set Jahr=%c
set Jahr=2008
for /f "tokens=1-7 delims=;" %%a in ('cscript //nologo %D% %DATE%') do set "Mon=%%d" & set "WoTag=%%f"
Deshalb würde ich (mit ganz konservativer Risikobereitschaft) hier sehr wohl eine Variable %Datum% (o.ä.) verwenden, die entweder die letzten 10 Stellen von %date% oder das letzte Token von 5%date% nimmt.
wenn "%date%"="01.06.2008" -->"%date:~-10%"="01.06.2008"
wenn "%date%"="So. 01.06.2008" -->"%date:~-10%"="01.06.2008"
-oder-
>for %a in (%date%) do @echo set datum=%a
set datum=So
set datum=01.06.2008 <---- Endergebnis
@pbelcl: Mag sich nach Haarspalterei anhören, aber wenn Dein Schnipsel evtl. mal auf verschiedenen Rechnern und verschiedenen Win-Versionen kaufen können soll, dann musst Du solchen Unsicherheiten umgehen.
Und deshalb sind die Prioriäten beim Coden eben "Lesbar, Wartbar, Erweiterbar,..." und irgendwo an Stelle 5 oder 6 meinetwegen "kompakt" und "so kurz wie möglich". Aber nicht an Stelle 1.
Grüße
Biber
Hallo pbelcl und Biber!
Natürlich ist Bibers Einwand berechtigt (wenn auch vorrangig für W2000 relevant) und bestätigt das oben Gesagte: Das integrierte Script funktioniert nur unter ganz bestimmten Bedigungen.
Wenn es tatsächlich ausschließlich darum geht, aus dem heutigen Datum (+ der aktuellen Uhrzeit) genau nach pbelcls Wünschen formatierte Strings %Filedatum% und %Zeitstempel% zu erzeugen, könnte zwar tatsächlich schmerzfrei eine externe .vbs-Datei verwendet werden, aber noch nicht einmal dann bringt's viel:
Diese Datei, zB gespeicher als "C:\Scripts\DatZerleg.vbs" wäre in einem Batch so zu verwenden:
Im Unterschied dazu die "integrierte" Variante (bei der ich sicher sein kann, dass sich das Script dort befindet, wo ich es erwarte):
Grüße
bastla
Natürlich ist Bibers Einwand berechtigt (wenn auch vorrangig für W2000 relevant) und bestätigt das oben Gesagte: Das integrierte Script funktioniert nur unter ganz bestimmten Bedigungen.
Wenn es tatsächlich ausschließlich darum geht, aus dem heutigen Datum (+ der aktuellen Uhrzeit) genau nach pbelcls Wünschen formatierte Strings %Filedatum% und %Zeitstempel% zu erzeugen, könnte zwar tatsächlich schmerzfrei eine externe .vbs-Datei verwendet werden, aber noch nicht einmal dann bringt's viel:
'DatZerleg.vbs
D=Date
T=Time
WScript.Echo Year(D)&"_"&Right("0"&Month(D),2)&"_"&Right("0"&Day(D),2)_
& ";" _
& WeekDayName(Weekday(D))&", "&Day(D)&". "&MonthName(Month(D))&" "&Year(D)& " um "&Right("0"&Hour(T),2)&":"&Right("0"&Minute(T),2)&":"&Right("0"&Second(T),2)
@echo off & setlocal
for /f "tokens=1-2 delims=;" %%i in ('cscript //nologo "C:\Scripts\DatZerleg.vbs"') do set "Filedatum=%%i" & set "Zeitstempel=%%j"
echo %FileDatum%
echo %Zeitstempel%
@echo off & setlocal
set D=%temp%\DatZerleg.vbs
echo D=Date:T=Time:WScript.Echo Year(D)^&"_"^&Right("0"^&Month(D),2)^&"_"^&Right("0"^&Day(D),2)^&";"^&WeekDayName(Weekday(D))^&", "^&Day(D)^&". "^&MonthName(Month(D))^&" "^&Year(D)^& " um "^&Right("0"^&Hour(T),2)^&":"^&Right("0"^&Minute(T),2)^&":"^&Right("0"^&Second(T),2)>%D%
for /f "tokens=1-2 delims=;" %%i in ('cscript //nologo %D%') do set "Filedatum=%%i" & set "Zeitstempel=%%j"
echo %FileDatum%
echo %Zeitstempel%
... würde das Codeschnipsel als "BlackBox" mit diversen parametern verwenden.
Auch damit würde sich grundsätzlich nichts ändern - die Verarbeitung der Parameter hätte ein umfangreicheres Script zur Folge, der Aufruf müsste zur Übernahme der Ergebnisse aber weiter über eine "for"-Schleife erfolgen ...Grüße
bastla
Moin pbelcl,
Es gibt mehrere "Do-Not-Knöpfe" in diesem Seitenarm des Forums, so zum Beispiel die Floskel "Danke im vorraus!" oder die Schreibweise "unbennen"... sowas solltest Du vermeiden.
Jedenfalls bei mir - bastla ist in der Hinsicht gelassener.
Soweit ich den Gerüchten hier auf den Forumsfluren Glauben schenke, ist bastla eher an Donuts und ich an Renates interessiert als beide zusammen an Donates...
Aber wir wissen beide die gute Absicht dankbar zu schätzen.
Grüße
Biber
gibt es eigentlich einen "Donate-Knopf" in diesem Forum wo ich mal draufdrücken kann??
Sagen wir so:Es gibt mehrere "Do-Not-Knöpfe" in diesem Seitenarm des Forums, so zum Beispiel die Floskel "Danke im vorraus!" oder die Schreibweise "unbennen"... sowas solltest Du vermeiden.
Jedenfalls bei mir - bastla ist in der Hinsicht gelassener.
Soweit ich den Gerüchten hier auf den Forumsfluren Glauben schenke, ist bastla eher an Donuts und ich an Renates interessiert als beide zusammen an Donates...
Aber wir wissen beide die gute Absicht dankbar zu schätzen.
Grüße
Biber
Eine kleine Anmerkung noch zu %date%:
Auch die Sprache des OS bringt durchaus kuriose Effekte bei der Verwendung.
Bei multilingual installierten Rechnern (Basis ist englisch) kommt es dabei auf die gerade aktive Sprache des Systems an... je nachdem kann man dann etwas mit der Ausgabe von %date:~-2% anfangen oder nicht...
Und je nachdem welches Datumsformat gerade eingestellt ist.
Des Weiteren behandeln Server die %date% Variable auch etwas unterschiedlich (W2K vs. W2K3) ...
mfg
Axel
Auch die Sprache des OS bringt durchaus kuriose Effekte bei der Verwendung.
Bei multilingual installierten Rechnern (Basis ist englisch) kommt es dabei auf die gerade aktive Sprache des Systems an... je nachdem kann man dann etwas mit der Ausgabe von %date:~-2% anfangen oder nicht...
Und je nachdem welches Datumsformat gerade eingestellt ist.
Des Weiteren behandeln Server die %date% Variable auch etwas unterschiedlich (W2K vs. W2K3) ...
mfg
Axel