pbelcl
Goto Top

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:
for /f "tokens=1-6 delims=:.," %%a in ("%date%") do @set Jahr=%%c  
4 Stellig.

Kann mir jemand einen Tip geben wie das funktioniert hat?

Content-ID: 88813

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

Ausgedruckt am: 25.11.2024 um 14:11 Uhr

bastla
bastla 31.05.2008 um 08:44:51 Uhr
Goto Top
Hallo pbelcl!

Am einfachsten so:
set Jahr=%date:~-2%
Grüße
bastla
pbelcl
pbelcl 31.05.2008 um 10:00:03 Uhr
Goto Top
Tja, einfach wenn man's weiss face-wink
Danke bastla!!
bastla
bastla 31.05.2008 um 10:04:58 Uhr
Goto Top
Hallo pbelcl!

Wenn Du's auch wissen willst face-wink: "set /?" zeigt, wie Du Teile von Variableninhalten erhalten kannst (gilt allerdings leider nicht für Laufvariable einer "for"-Schleife der Art "%%i") ...

Grüße
bastla
pbelcl
pbelcl 31.05.2008 um 11:43:41 Uhr
Goto Top
Das ist ja toll, hätte das nie probiert, da die Hilfefunktion am Commandpromt meist eher wenig hergibt face-wink
Interessant was mit SET alles möglich ist...

Bei der Gelegenheit:
Gibt es eine einfache Möglichkeit das Monat ausgeschrieben (z.B. "Februar") oder den Wochentag aus der Datumsvariable rauszukitzeln?

Ich habe hier im Forum nur eher komplexe Beispiele gefunden (z.B den mit Robocopy), das ist mir etwas zu komplex, auch hab ich robocopy nicht überall verfügbar.
Suche was mit WIndows XP Boardmitteln ...
bastla
bastla 31.05.2008 um 14:56:34 Uhr
Goto Top
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:
@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%
Ergebnis:
Teilinformationen zu 1.6.2008:
2008;6;1;Juni;Jun;Sonntag;So
Monatsname: Juni
Wochentag: Sonntag
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:
echo D=WScript.Arguments(0):WScript.Echo MonthName(Month(D))^&";"^&WeekDayName(Weekday(D))>%D%  
Grüße
bastla
pbelcl
pbelcl 31.05.2008 um 15:13:10 Uhr
Goto Top
Hallo bastla,

Danke für die viele Mühe Die Du dir gemacht hast!!
Deine Anleitung klingt noch komplizierter, als meine bisherigen "Fundstücke".

Sorry aber mit VB hab ich nicht viel am Hut, daher versteh ich vielleicht noch nicht ganz was Du mir da zusammengestellt hast.

Offensichtlich gibt es keine DOS-Batch Möglichkeit dafür, dann lass ich's lieber!
War nur mein Perfektionismus der meine Backupdateien lieber mit dem ausgeschriebenen Monat gesehen hätte face-wink

Danke jedenfalls!!
bastla
bastla 31.05.2008 um 16:48:24 Uhr
Goto Top
Hallo pbelcl!

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
pbelcl
pbelcl 31.05.2008 um 16:55:41 Uhr
Goto Top
Hallo bastla,

Habs gerade ausprobiert und es funktioniert!!

Sorry aber ich glaube da hab ich jetzt zu kompliziert gedacht, sind ja in wirklichkeit "nur" 8 Zeilen.

Gib mir noch etwas Zeit, ich werde versuchen es in meine Zeit.bat einzubauen und werde das Ergebnis hier posten .....
pbelcl
pbelcl 31.05.2008 um 17:14:45 Uhr
Goto Top
Nun hast Du mich angespornt! face-smile

Bin gerade dabei das zu verstehen, sorry wenn ich vielleicht etwas dumm frage:

1.) warum die Variable DATUM ich hole mir in meiner For Next Schleife das Datum aus der Variable %DATE%.
Oder muss ich wenn es das aktuelle Datum sein soll mit:
set datum = %DATE% 
arbeiten?

2.) Könnte ich das VBS eigentlich auch in meinen Batchpfad abspeichern und dann mit meiner zeit.bat darauf zugreifen. Dann wäre der Syntax IM batch doch etwas einfacher, oder?

Hab das mal probiert,

dat.vbs =
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)  
aber ohne Erfolg.

Wenn Du noch Lust hast werde ich versuchen mit Deiner Hilfe mein ERSTES .vbs zu "schreiben" face-wink

Danke jedenfalls bis hierher .....
Biber
Biber 31.05.2008 um 17:51:57 Uhr
Goto Top
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
bastla
bastla 31.05.2008 um 18:02:35 Uhr
Goto Top
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:
set Datum=%DATE%
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:
for /f "tokens=1-7 delims=;" %%a in ('cscript //nologo %D% %DATE%') do set "Mon=%%d" & set "WoTag=%%f"  
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 ... face-wink
Biber
Biber 01.06.2008 um 02:38:32 Uhr
Goto Top
Moin bastla,

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  
Diese würde auch funktionieren, wenn das Datum so aussieht:
>echo %date%
So 01.06.2008
>for /f "tokens=1-6 delims=:.," %a in ("%date%") do @echo set Jahr=%c  
set Jahr=2008
Auf Deinen letzten Schnipsel angewendet allerdings...
for /f "tokens=1-7 delims=;" %%a in ('cscript //nologo %D% %DATE%') do set "Mon=%%d" & set "WoTag=%%f"  
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-
>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
pbelcl
pbelcl 01.06.2008 um 08:30:38 Uhr
Goto Top
Hi Leute,

Da hab ich ja wieder interessante Diskussionen angeregt face-wink

Nun werde ich Euch vielleicht doch die ganze Geschichte erzählen:

Ich habe derzeit ein batch laufen welches ich immer starte wenn ich Datumsmanipulationen mit Files mache. Dieses sieht derzeit so aus:

rem time_set.bat 
@echo off
rem Zeitvariablen für Batchdateien aus aktuellem Datum generieren
rem wenn %1 "silent" ist dann KEINE Bildschirmausgabe  

for /f "tokens=1-6 delims=:.," %%a in ("%date%") do @set Tag=%%a  
for /f "tokens=1-6 delims=:.," %%a in ("%date%") do @set Monat=%%b  
for /f "tokens=1-6 delims=:.," %%a in ("%date%") do @set Jahr=%%c  
for /f "tokens=1-6 delims=:.," %%a in ("%Time%") do @set Stunde=%%a  
for /f "tokens=1-6 delims=:.," %%a in ("%Time%") do @set Minute=%%b  
for /f "tokens=1-6 delims=:.," %%a in ("%Time%") do @set Sekunde=%%c  
for /f "tokens=1-6 delims=:.," %%a in ("%Time%") do @set JJ=%date:~-2%  

set Datum=%Tag%.%Monat%.%Jahr%
set Zeit=%Stunde%:%Minute%:%Sekunde%

rem Zeitstempel wird für fast alle Logfiles verwendet
set Zeitstempel=%Tag%.%Monat%.%Jahr% um %Stunde%:%Minute%:%Sekunde% 

rem Filedatum wird für die Benamung von Sicherungsdateien verwendet! Jahr IMMER vorne!
set Filedatum=%Jahr%_%Monat%_%Tag%

if %1!==silent! goto end
:end
Dieses Batch schreibt mir Datum (oder Teile) in diverse Variablen die ich verwende um Files aus einer Sicherung umzunennen.

Meine Idee war nun zusätzlich den Wochentag (ausgeschrieben) und das Monat (ausgeschrieben) auch noch da drinnen zu haben.

Ist nicht so wichtig, aber nun denke ich dass ein alleinstehendes VB-Script welches ich nur mehr aus einem Batch aufrufe vielleicht flexibler wäre.

Dann könnte ich statt "call Time_set.bat" in die batches z.B. "call datzerleg.vbs" reinschreiben.

Ich habe wie gesagt keine Ahnung von VBS und würde das Codeschnipsel als "BlackBox" mit diversen parametern verwenden.

Ist das ohne große Nachdenkarbeit für Euch möglich?
Soll keine Doktorarbeit weden, denn ich denke ihr beide habt auch besseres zu tun face-wink
bastla
bastla 01.06.2008 um 10:43:46 Uhr
Goto Top
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:
'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)  
Diese Datei, zB gespeicher als "C:\Scripts\DatZerleg.vbs" wäre in einem Batch so zu verwenden:
@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%
Im Unterschied dazu die "integrierte" Variante (bei der ich sicher sein kann, dass sich das Script dort befindet, wo ich es erwarte):
@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
pbelcl
pbelcl 02.06.2008 um 15:16:01 Uhr
Goto Top
Hi Leute,

Danke für die vielen Infos, die ich nun alle verarbeitet habe face-wink

Das Ergebnis ist nun:

@echo off

for /f "tokens=1-6 delims=:.," %%a in ("%date%") do @set Tag=%%a  
for /f "tokens=1-6 delims=:.," %%a in ("%date%") do @set Monat=%%b  
for /f "tokens=1-6 delims=:.," %%a in ("%date%") do @set Jahr=%%c  
for /f "tokens=1-6 delims=:.," %%a in ("%Time%") do @set Stunde=%%a  
for /f "tokens=1-6 delims=:.," %%a in ("%Time%") do @set Minute=%%b  
for /f "tokens=1-6 delims=:.," %%a in ("%Time%") do @set Sekunde=%%c  
@set Jahr2=%date:~-2%

set Datum=%Tag%.%Monat%.%Jahr%
set Zeit=%Stunde%:%Minute%:%Sekunde%
set Zeitstempel=%Datum% um %Zeit% 
set Filedatum=%Jahr%_%Monat%_%Tag%

rem Wochentag und Monat mittels Skript setzen
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%   
for /f "tokens=1-7 delims=;" %%a in ('cscript //nologo %D% %Datum%') do set "Mon=%%d" & set "WoTag=%%f"  

if %1!==silent! goto end
if %1!==! echo Zeitvariablen gesetzt: %Zeitstempel% Monatsname: %Mon% - Wochentag: %WoTag% - Jahr2: %Jahr2%
pause
goto end

:end
Ich glaube das ist GENAU das was ich brauche. Und schlanker geht es dank Eurer ausführlichen
Erklärungen offensichtlich wirklich nicht.

Hat mir wieder bewiesen dass ich bei BATCH bleibe und nicht meine Nase in VBS stecke face-smile
Danke nochmal für die vielen COdeschnipsel und Erklärungen ....

PS: Ihr habt mir nun schon sehr oft bei solchen Problemchen oder Problemen geholfen, gibt es eigentlich einen "Donate-Knopf" in diesem Forum wo ich mal draufdrücken kann??
Biber
Biber 02.06.2008 um 16:14:50 Uhr
Goto Top
Moin pbelcl,

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
ahe
ahe 04.06.2008 um 18:43:22 Uhr
Goto Top
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