Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
Kommentar vom Moderator Biber am 24.03.2010 um 20:28:24 Uhr
Habe diesen Beitrag heute auf "gelöst" gesetzt.
Eigentlich ist das ja fast ein Teil 4 des "Batch for Runaways"-Wokshops geworden... der sollte auch auf "benutzer.de" sichtbar sein.
GELÖST

Internationales Datum und Zeitzone bestimmen

Frage Entwicklung Batch & Shell

Mitglied: DaSilva

DaSilva (Level 1) - Jetzt verbinden

18.06.2008, aktualisiert 24.03.2010, 6022 Aufrufe, 14 Kommentare

Hilfe bei kleinem Batchscript benötigt.

Ich möchte in eine Datei das Datum inkl. Wochentag und Uhrzeit schreiben.
Die deutsche Version ist auch fertig, nur die englische bereitet mir noch Probleme.
Wie kann ich das Datum als MM-TT-YYYY statt TT.MM.YYYY ausgeben lassen ohne die Tastatur oder sonstige Regionaleinstellungen zu ändern?
Der bisherige Code sieht so aus:

01.
FOR /F "tokens=1,2,3 delims=." %%a in ('echo %date%') do set yy=%%c & set mm=%%b & set dd=%%a 
02.
 
03.
set /a "TwoDigitYearMax=2038%%1000" 
04.
if 1%yy% LSS 200 if 1%yy% LSS 1%TwoDigitYearMax% (set yy=20%yy%) else (set yy=19%yy%) 
05.
set /a dd=100%dd%%%100,mm=100%mm%%%100 
06.
set /a zDe=14-mm,zDe/=12,y=yy+4800-zDe,m=mm+12*zDe-3,dowDe=153*m+2 
07.
set /a dowDe=dowDe/5+dd+y*365+y/4-y/100+y/400-2472630,dowDe%%=7,dowDe+=1 
08.
set /a zEn=14-mm,zEn/=12,y=yy+4800-zEn,m=mm+12*zEn-3,dowEn=153*m+2 
09.
set /a dowEn=dowEn/5+dd+y*365+y/4-y/100+y/400-2472630,dowEn%%=7,dowEn+=1 
10.
 
11.
If %dowDe% equ 1 set "WoTaDe=Montag" 
12.
If %dowDe% equ 2 set "WoTaDe=Dienstag" 
13.
If %dowDe% equ 3 set "WoTaDe=Mittwoch" 
14.
If %dowDe% equ 4 set "WoTaDe=Donnerstag" 
15.
If %dowDe% equ 5 set "WoTaDe=Freitag" 
16.
If %dowDe% equ 6 set "WoTaDe=Samstag" 
17.
If %dowDe% equ 7 set "WoTaDe=Sonntag" 
18.
If %dowEn% equ 1 set "WoTaEn=Monday" 
19.
If %dowEn% equ 2 set "WoTaEn=Tuesday" 
20.
If %dowEn% equ 3 set "WoTaEn=Wednesday" 
21.
If %dowEn% equ 4 set "WoTaEn=Thursday" 
22.
If %dowEn% equ 5 set "WoTaEn=Friday" 
23.
If %dowEn% equ 6 set "WoTaEn=Saturday" 
24.
If %dowEn% equ 7 set "WoTaEn=Sunday" 
25.
 
26.
rem // Erstellt zeit.cfg + gibt das aktuelle Datum und die aktuelle Zeit an. 
27.
echo say Es ist %WoTaDe%, der %date% um %time:~0,8% Uhr in Deutschland > ZeitDe.cfg  
28.
echo say It ist %WoTaEn%, the %date% at %time:~0,8% clock in Germany > ZeitEn.cfg 
Ergebnis:

01.
say Es ist Sonntag, der 15.06.2008 um 1:01:38 Uhr in Deutschland   
02.
say It ist Sunday, the 15.06.2008 at 1:01:38 clock in Germany  
Zusätzlich sollte auch die Zeit im zwölf Stunden Format angezeigt werden (geht immer nur um die ZeitEn.cfg) und würde man das im Englischen überhaupt so formulieren?
Als letzter Punkt wäre noch interessant wenn UTC+1 oder UTC+2 angegeben werden kann, je nachdem ob gerade Sommerzeit herrscht oder nicht.

Danke für Hilfe.
Mitglied: Biber
19.06.2008 um 00:26 Uhr
Moin DaSilva,

Rückfragen:
  • soll das Skript nur auf deinem Rechner laufen oder auf "beliebigen"?
  • falls "beliebig": Betriebssystem W2K/XP/Vista und mal als DE, mal als US-Version?
  • WhoThe... wer bitte erwartet von Dir die Info, ob auf dem Rechner automatisch Sommerzeit angezeigt wird???? Wo das in der Registry steht, weiß außerhalb von Redmond eine Handvoll Spinner Entwickler.

[Zu 1 und 2: In deinem Skriptchen gehst Du ja davon aus, dass das deutsche XP-Datumsformat gegeben ist; bei W2000 oder bei englischem Datumsformat würde die %date%-Auswertung ja nicht laufen.]

Grüße
Biber
Bitte warten ..
Mitglied: DaSilva
19.06.2008 um 00:51 Uhr
Erstmal würde es auf meinem Rechner (Vista DE) reichen. Universell wäre aber nett.

Falls man die Zeitzone nicht irgendwo heraus bekommt, gibt es keine Abfrage?

"Derzeit beginnt die mitteleuropäische Sommerzeit jeweils am letzten Sonntag im März um 2 Uhr mitteleuropäischer Zeit. Zum Zeitpunkt des Beginns der Sommerzeit wird die Stundenzählung um eine Stunde von 2 Uhr auf 3 Uhr vorgestellt. Die Sommerzeit endet jeweils am letzten Sonntag im Oktober um 3 Uhr mitteleuropäischer Sommerzeit. Zum Zeitpunkt des Endes der Sommerzeit wird die Stundenzählung um eine Stunde von 3 Uhr auf 2 Uhr zurückgestellt."
Bitte warten ..
Mitglied: Biber
19.06.2008 um 20:38 Uhr
Moin DaSilva,

danke Dir für die aufmunternde Sommerzeit-Definition....
Aber leider kann man/frau im Batch keine Datumsberechnungen machen.
Es gibt schlicht und einfach keinen Datentyp "Datum" im CMD-Interpreter.

Siehe oben bei den Verrenkungen, die Du zur Wochentagsberechnung machen musstest.

Also: ich sehe drei oder vier Möglichkeiten:
  • Im obigen Batch das angelsächsische Datumsformat durch Substring-Funktionen bezogen auf die (vermutlichen) TAG und MONAT-Werte hinfrickeln. Wird dann vollkommen irrwitzig, wenn Du diesen Batch dann auf einem EN- oder US-sprachigen W2000-Rechner startest
  • Im Anfang irgendwie das Datum via Utility "sprachunabhängig" ermitteln lasssen. Zum Beispiel das Now.exe aus dem ResKit kann so etwas.
  • oder alles ohne Drittutilities mit Batch/Reg.exe aus/mit der Registry abfackeln.

Was die GMT/UTC-Abweichung/Berechnung betrifft... geht nur entweder über Registry (was ich mir grad noch zutraue) oder über dubiose Win-API-Calls von GetTimeToLocalTime() oder so ähnlich. Was ich nicht freiwillig für eine Benutzer-Display-Meldung anfasse.

Lohnen sich Aufwand und Nutzen?

Grüße
Biber




[Edit Biber 21.06.2008]
Recommended - was wohl nicht so herauskam - ist der Weg über Utilities, "die das können". Z.B. Now.exe aus dem ResKit oder ein Tool wie ShowDate vom geschätzten Forumsmitglied Axel Hahn, s.u. Links in "Batch und Shell".
Alle folgenden Kommentare haben eher Workshop-Charakter und sind nicht unbedingt Empfehlungen für produktive Lösungen.
[/Edit]
Bitte warten ..
Mitglied: DaSilva
20.06.2008 um 17:13 Uhr
Hmmm, wahrscheinlich eher nicht ;)
Trotzdem danke.
Bitte warten ..
Mitglied: Biber
20.06.2008 um 17:31 Uhr
Na ja, DaSilva,

ich will ja nicht, dass Du so betrübt ins Wochenende gehst...
Bezüglich der Zeitzonen-Infos hab ich noch mal schnell was zusammengeharkt.

Wenn Du XP/Vista hast und die Reg.exe (ist Standard bei denen) und auf HKLM zugreifen kannst, dann tut es dieser Schnipsel.
01.
@echo off & setlocal 
02.
:: optional ....Summertime.... and the living is easy... 
03.
:: Geht natürlich nur mit Rechten auf HKLM... 
04.
Set regkey="HKLM\System\CurrentControlSet\Control\TimeZoneInformation" 
05.
call :SaveOldValue ActiveTimeBias 
06.
call :SaveOldValue DaylightBias 
07.
call :SaveOldValue StandardName 
08.
call :SaveOldValue DaylightName 
09.
call :SaveOldValue Bias 
10.
If defined old_Bias             Set /a GMTdiff= %old_Bias% / -60 
11.
If defined old_ActiveTimeBias   Set /a Actdiff= %old_ActiveTimeBias% / -60 
12.
If defined old_DayLightBias Set /a UTCdiff= %old_DaylightBias% / -60 
13.
:: ----------- 
14.
If defined ActDiff echo Act-Differenz in Stunden plus/minus: [All+%ActDiff%] 
15.
if defined old_StandardName Echo Zeitzone: %old_StandardName% 
16.
if defined old_DaylightName Echo Sommerzeit: %old_DaylightName% 
17.
If defined GMTDiff echo GMT-Differenz in Stunden plus/minus: [GMT+%GMTDiff%] 
18.
If defined UTCDiff echo UTC-Differenz in Stunden plus/minus: [UTC+%UTCDiff%] 
19.
 
20.
goto :eof 
21.
 
22.
 
23.
~~~~~~~~~ [End of bätschelchen] 
24.
:SetNewvalue param1=wert param2=value in Anfü-Zeichen 
25.
reg add %regkey% /v "%~1" /d "%~2" /f >nul 
26.
goto :eof 
27.
 
28.
:SaveOldValue param1=regValue  
29.
REM Anmerkung: wenn es den Wert nicht gibt oder keine Rechte darauf, 
30.
REM dann kommt keine Fehlermeldung, aber die Variable ist nicht definiert. 
31.
For /f "tokens=2*" %%i in ('reg query %regkey% /v "%~1" ^2^>nul^|findstr  /i "%~1"') do ( 
32.
    set "old_%1=%%j" 
33.
)  
34.
goto :eof 
35.
 
Output:
01.
>e:\schnipsel\GetTimezones.cmd 
02.
Act-Differenz in Stunden plus/minus: [All+2] 
03.
Zeitzone: Westeuropäische Normalzeit 
04.
Sommerzeit: Westeuropäische Normalzeit 
05.
GMT-Differenz in Stunden plus/minus: [GMT+1] 
06.
UTC-Differenz in Stunden plus/minus: [UTC+1]
... wobei, wenn ich die Registry-Werte richtig interpretiere dort für meinen Rechner herauskommen müsste, dass er momentan 1 Stunde zur GMT-Zeit versetzt + 1 Stunde wg. Sommerzeit vorgestellt ist, also [Zeile Act-Differenz] alles in Allem +2 Std Differenz vorzuweisen hat.

Grüße
Biber
Bitte warten ..
Mitglied: DaSilva
20.06.2008 um 18:15 Uhr
Waoh, danke.
Das mit der englischen Zeitangabe ist auf einem deutschen System wohl nicht möglich!?
Bitte warten ..
Mitglied: Biber
20.06.2008 um 18:38 Uhr
Moin DaSilva,

natürlich ist es möglich... alles außer Brotschneiden geht per Batch.

Nur die Strategie ist die Frage - siehe oben, wo ich mich über mögliche Wege ausgelassen habe.

Das Datumsermittlung im Windows-Batch ist ja nicht nur zwei-, sondern eher schon dreischneidig.

  • Erstens kennt die CMD.exe keine Datums-Arithmetik. Alles ist "Text".
  • Zweitens bekommst Du, wenn Du am CMD-Prompt nach Datum und Zeit fragst, irgendetwas menschenlesbares (mit/ohne Wochentag abgekürzt oder ausgeschrieben, in der Reihenfolge TTMMJJJJ oder MM/DD/YYYY oder als YYYY-MM-DD... ) und Du weißt nicht was Du bekommst
  • Drittens ist diese ganze "Regions- und Spracheinstellung"-Arie so dermaßen zusammengeschlampert von den redmonder Praktikanten, dass ich mittlerweile auch so wesentlich brutaleren Methoden bei der Datumsermittlung greife als M$ sich trauen würde.

In meinem Workshop "Batch for Runaways III" (siehe unten unter mögliche Anleitungen) hatte ich noch geschrieben, ich muss halt das "unstruktierte" und beliebige Datums/Zeitformat normalisieren, das mir vom Tisch des sympathischen Weltmarktführers in den Schoß bzw. in den Batch fällt

Shice drauf. Sehe ich lockerer inzwischen.
Jetzt schiesse ich halt das Datumsformat selber per Registry um und bekomme dann Tage, Monate, Jahre und auch Wochentage wann und wo ich will.
Und hinterher stelle ich den alten Zustand wieder her.

Beispiel.
01.
:: -----------Snipp GetEnDeCfg.cmd 
02.
:: Biber 2008 als Fussnote zum Workshop Batch 4 Runaways III" 
03.
::  "Umgang mit Datums- und Zeitvariablen im Batch" 
04.
@echo off & setlocal 
05.
REM Achtung: Unter W2000 _kein_ Fehler, aber auch kein sichtbarer Effekt 
06.
REM Die sofortige Nutzbarkeit der neuen Date/t und Time/t-Reg-Settings erst ab XP 
07.
 
08.
set regkey="HKEY_CURRENT_USER\Control Panel\International" 
09.
call :SaveOldValue sShortdate 
10.
call :SaveOldValue s1159 
11.
call :SaveOldValue s2359 
12.
call :SaveOldValue sTimeFormat 
13.
REM unused call :SaveOldValue iDate 
14.
REM unused call :SaveOldValue iTime 
15.
For %%i in (sShortDate s1159 s2359 sTimeformat) do @( 
16.
       if not defined old_%%i (  
17.
          @echo Fehler: %regkey% value "%%i" nicht gefunden 
18.
          pause  
19.
          goto :eof 
20.
       )    
21.
22.
 
23.
:: set old_  <--- uncomment here for debug 
24.
:: würde diese nächsten Zeilen anzeigen 
25.
:: old_sShortdate=dd.MM.yyyy 
26.
:: old_iDate=1 
27.
:: old_s1159=AM 
28.
:: old_s2359=PM 
29.
:: old_sTimeFormat=HH:mm:ss 
30.
 
31.
 
32.
:: Originaldatum/zeit sichern 
33.
For /f "delims=" %%i in ('time/t') do set "xyTime=%%i" 
34.
For /f "delims=" %%i in ('date/t') do set "xyDate=%%i" 
35.
 
36.
:: mal M$ einen freundlichen Gruß senden :-P 
37.
:: ..."coden wie ein Redmonder" ....muahaha... 
38.
call :SetNewValue   sShortdate "ddd" 
39.
For /f %%i in ('date/t') do set "WoTach=%%i" 
40.
:: na...mitbekommen, was ich eben gemacht habe?? 
41.
 
42.
 
43.
If "%WoTach%" equ "Mo" set "WoTaDe=Montag"     & set "WoTaEn=Monday"  
44.
If "%WoTach%" equ "Di" set "WoTaDe=Dienstag"   & set "WoTaEn=Tuesday" 
45.
If "%WoTach%" equ "Mi" set "WoTaDe=Mittwoch"   & set "WoTaEn=Wednesday" 
46.
If "%WoTach%" equ "Do" set "WoTaDe=Donnerstag" & set "WoTaEn=Thursday" 
47.
If "%WoTach%" equ "Fr" set "WoTaDe=Freitag"    & set "WoTaEn=Friday" 
48.
If "%WoTach%" equ "Sa" set "WoTaDe=Samstag"    & set "WoTaEn=Saturday" 
49.
If "%WoTach%" equ "So" set "WoTaDe=Sonntag"    & set "WoTaEn=Sunday" 
50.
if defined WoTaDe goto :allesEasy 
51.
If "%WoTach%" equ "Mon" set "WoTaDe=Montag"     & set "WoTaEn=Monday"  
52.
If "%WoTach%" equ "Thu" set "WoTaDe=Dienstag"   & set "WoTaEn=Tuesday" 
53.
If "%WoTach%" equ "Wed" set "WoTaDe=Mittwoch"   & set "WoTaEn=Wednesday" 
54.
If "%WoTach%" equ "Thu" set "WoTaDe=Donnerstag" & set "WoTaEn=Thursday" 
55.
If "%WoTach%" equ "Fri" set "WoTaDe=Freitag"    & set "WoTaEn=Friday" 
56.
If "%WoTach%" equ "Sat" set "WoTaDe=Samstag"    & set "WoTaEn=Saturday" 
57.
If "%WoTach%" equ "Sun" set "WoTaDe=Sonntag"    & set "WoTaEn=Sunday" 
58.
:allesEasy 
59.
 
60.
:: auf deutsches XP-Date-Format setzen 
61.
:: unused call :SetNewValue    iDate 
62.
call :SetNewValue   sShortdate "dd.MM.yyyy" 
63.
call :SetNewValue   s1159 "" 
64.
call :SetNewValue   s2359 "" 
65.
call :SetNewValue   sTimeFormat "HH:mm:ss" 
66.
 
67.
For /f "delims=" %%i in ('time/t') do set "deTime=%%i" 
68.
For /f "delims=" %%i in ('date/t') do set "deDate=%%i" 
69.
 
70.
:; auf amerkanisches Date-Format setzen 
71.
:: unused call :SetNewValue    iDate 
72.
call :SetNewValue   sShortdate "MM-dd-yyyy" 
73.
call :SetNewValue   s1159 "AM" 
74.
call :SetNewValue   s2359 "PM" 
75.
call :SetNewValue   sTimeFormat "hh:mm:ss tt" 
76.
 
77.
For /f "delims=" %%i in ('time/t') do set "enTime=%%i" 
78.
For /f "delims=" %%i in ('date/t') do set "enDate=%%i" 
79.
 
80.
REM unused call :SetNewValue    iDate 
81.
call :SetNewValue  s1159 "%old_s1159%" 
82.
call :SetNewValue  s2359 "%old_s2359%" 
83.
call :SetNewValue  sTimeFormat "%old_sTimeFormat%" 
84.
call :SetNewValue  sShortdate "%old_sShortDate%" 
85.
 
86.
:: optional ....Summertime.... and the living is easy... 
87.
:: Geht natürlich nur mit Rechten auf HKLM... 
88.
Set regkey="HKLM\System\CurrentControlSet\Control\TimeZoneInformation" 
89.
call :SaveOldValue ActiveTimeBias 
90.
call :SaveOldValue DaylightBias 
91.
call :SaveOldValue StandardName 
92.
call :SaveOldValue DaylightName 
93.
call :SaveOldValue Bias 
94.
If defined old_Bias             Set /a GMTdiff= %old_Bias% / -60 
95.
If defined old_ActiveTimeBias   Set /a Actdiff= %old_ActiveTimeBias% / -60 
96.
If defined old_DayLightBias Set /a UTCdiff= %old_DaylightBias% / -60 
97.
:: ----------- 
98.
Echo xyDate [xyTime]: %xyDate% [%xytime%] 
99.
Echo deDate [deTime]: %deDate% [%detime%] 
100.
Echo enDate [entime]: %enDate% [%entime%] 
101.
Echo WoTach: [%WoTach%] WoTaDe [%WoTaDe%] WoTaEn: [%WotaEn%] 
102.
If defined ActDiff echo Act-Differenz in Stunden plus/minus: [All+%ActDiff%] 
103.
if defined old_StandardName Echo Zeitzone: %old_StandardName% 
104.
if defined old_DaylightName Echo Sommerzeit: %old_DaylightName% 
105.
If defined GMTDiff echo GMT-Differenz in Stunden plus/minus: [GMT+%GMTDiff%] 
106.
If defined UTCDiff echo UTC-Differenz in Stunden plus/minus: [UTC+%UTCDiff%] 
107.
echo\ 
108.
Echo @DaSilva: 
109.
echo say Heute ist %WoTach%, der %xyDate% um %xytime% in XY-Land 
110.
echo say Heute ist %WoTaDe%, der %deDate% um %time% Uhr in Deutschland 
111.
echo say Today is %WoTaEn%, %endate% %EnTime% in Germany 
112.
 
113.
goto :eof 
114.
 
115.
 
116.
~~~~~~~~~ [End of bätschelchen] 
117.
:SetNewvalue param1=wert param2=value in Anfü-Zeichen 
118.
If %2=="""" (  
119.
   reg add %regkey% /v "%~1" /f >nul 
120.
) else (    
121.
reg add %regkey% /v "%~1" /d "%~2" /f >nul 
122.
123.
goto :eof 
124.
 
125.
:SaveOldValue param1=regValue  
126.
For /f "tokens=2*" %%i in ('reg query %regkey% /v "%~1" ^2^>nul^|findstr  /i "%~1"') do ( 
127.
    If "%%j" Equ "" (set old_%1="") else set "old_%1=%%j" 
128.
)  
129.
goto :eof
Output dieses Schnipsels:
01.
>e:\schnipsel\GetEnDeCfg.cmd 
02.
xyDate [xyTime]: 20.06.08  [18:33] 
03.
deDate [deTime]: 20.06.2008  [18:33] 
04.
enDate [entime]: 06-20-2008  [06:33 PM] 
05.
WoTach: [Fr] WoTaDe [Freitag] WoTaEn: [Friday] 
06.
Act-Differenz in Stunden plus/minus: [All+2] 
07.
Zeitzone: Westeuropõische Normalzeit 
08.
Sommerzeit: Westeuropõische Normalzeit 
09.
GMT-Differenz in Stunden plus/minus: [GMT+1] 
10.
UTC-Differenz in Stunden plus/minus: [UTC+1] 
11.
 
12.
@DaSilva: 
13.
say Heute ist Fr, der 20.06.08  um 18:33 in XY-Land 
14.
say Heute ist Freitag, der 20.06.2008  um 18:33:56,25 Uhr in Deutschland 
15.
say Today is Friday, 06-20-2008  06:33 PM in Germany
[--vorsichtig testen und nicht blind verkaufen-- ist nur schnell zusammengeschrotet]

Die ganze Wochentagsberechnung z.B spar ich mit, indem ich einfach das datums-Anzeigeformat auf "ddd" setze statt das "dd.MM.yyyy" hinzunehmen.
Siehe in Zeile 33ff.
So bekomme ich bei einem "date /t" die Ausgabe "Fr"... *g

Aber ich gebe zu, dass so ein Vorgehen natürlich kein Professionelles ist.
...kann auch gut damit leben....

Grüße
Biber
[Edit] Umgang mit vorhandenen {leeren} Registry-Werten geändert - setNewValue/SaveOldValue angepasst. Siehe unten. [/Edit]
Bitte warten ..
Mitglied: DaSilva
20.06.2008 um 19:17 Uhr
Das ist unglaublich!
Leider bekomme ich folgende Fehlermeldung:

Fehler: "HKEY_CURRENT_USER\Control Panel\International" value "s1159" nicht gefunden

Kann das an Vista liegen?
Bitte warten ..
Mitglied: Biber
20.06.2008 um 22:58 Uhr
Moin DaSilva,

Kann das an Vista liegen?
Teils, teils.
Dass diese Fehlermeldung kommt, "ist ein beabsichtigtes Verhalten" (um eine bekannte Redmonder Softwareklitsche zu zitieren). Works as designed, wie wir Biber sagen.

Oben im Schnipsel kannst Du nachverfolgen, dass ich natürlich erst versuche, die vorhandenen HKCU-Werte des Users zu lesen und zu sichern, bevor ich sie mit irgendeinem Dreck überschreibe.
Wenn es die Werte nicht gibt, steigt das Skript (kontrolliert) aus.
Den Schlüssel "sShortDate", in dem so etwas wie "dd.MM.yyyy" bei Dir stehen wird, den hat er gefunden.
Die beiden Werte "s1159" und "s2359" sind bei Dir wohl nicht definiert, weil Du -trotz Deiner Anglophilie- noch nie mit Us-Datumsformat gearbeitet an diesem Rechner.
--> definiere sie einfach. Liest /interpretiert außer meinem Skript ja keiner.

Bitte an den CMD-Prompt:
01.
set regkey="HKEY_CURRENT_USER\Control Panel\International"  
02.
reg add %regkey% /v s1159 /d "vm" 
03.
reg add %regkey% /v s2359 /d "nm"
"vm" für vormittach, "nm" für nachmMittach
Oder jeweils auf "". (Leerstring)
-->vollkommen wurscht, sieht keiner.
Die bei Dir vorhandenen Werte solltest Du Dir am besten einmal anzeigen und kopieren:
01.
reg query %regkey% /s
Dann schauen wir weiter.

Grüße
Biber
Bitte warten ..
Mitglied: DaSilva
20.06.2008 um 23:53 Uhr
Danke, jetzt hat alles geklappt.
Hier ist das an meine Bedürfnisse angepasste Script:

01.
:: -----------Snipp GetEnDeCfg.cmd 
02.
:: Biber 2008 als Fussnote zum Workshop Batch 4 Runaways III" 
03.
::  "Umgang mit Datums- und Zeitvariablen im Batch" 
04.
@echo off & setlocal 
05.
REM Die nächsten drei Zeilen aktivieren ("REM" entfernen) wenn Fehler mit Registry auftritt 
06.
REM set regkey="HKEY_CURRENT_USER\Control Panel\International"  
07.
REM reg add %regkey% /v s1159 /d "vm" 
08.
REM reg add %regkey% /v s2359 /d "nm" 
09.
set regkey="HKEY_CURRENT_USER\Control Panel\International" 
10.
call :SaveOldValue sShortdate 
11.
call :SaveOldValue s1159 
12.
call :SaveOldValue s2359 
13.
call :SaveOldValue sTimeFormat 
14.
REM unused call :SaveOldValue iDate 
15.
REM unused call :SaveOldValue iTime 
16.
For %%i in (sShortDate s1159 s2359 sTimeformat) do @( 
17.
       if not defined old_%%i (  
18.
          @echo Fehler: %regkey% value "%%i" nicht gefunden 
19.
          pause  
20.
          goto :eof 
21.
       )    
22.
23.
 
24.
:: set old_  <--- uncomment here for debug 
25.
:: würde diese nächsten Zeilen anzeigen 
26.
:: old_sShortdate=dd.MM.yyyy 
27.
:: old_iDate=1 
28.
:: old_s1159=AM 
29.
:: old_s2359=PM 
30.
:: old_sTimeFormat=HH:mm:ss 
31.
 
32.
 
33.
:: Originaldatum/zeit sichern 
34.
For /f "delims=" %%i in ('time/t') do set "xyTime=%%i" 
35.
For /f "delims=" %%i in ('date/t') do set "xyDate=%%i" 
36.
 
37.
:: mal M$ einen freundlichen Gruß senden :-P 
38.
:: ..."coden wie ein Redmonder" ....muahaha... 
39.
call :SetNewValue   sShortdate "ddd" 
40.
For /f %%i in ('date/t') do set "WoTach=%%i" 
41.
:: na...mitbekommen, was ich eben gemacht habe?? 
42.
 
43.
 
44.
If "%WoTach%" equ "Mo" set "WoTaDe=Montag"     & set "WoTaEn=Monday"  
45.
If "%WoTach%" equ "Di" set "WoTaDe=Dienstag"   & set "WoTaEn=Tuesday" 
46.
If "%WoTach%" equ "Mi" set "WoTaDe=Mittwoch"   & set "WoTaEn=Wednesday" 
47.
If "%WoTach%" equ "Do" set "WoTaDe=Donnerstag" & set "WoTaEn=Thursday" 
48.
If "%WoTach%" equ "Fr" set "WoTaDe=Freitag"    & set "WoTaEn=Friday" 
49.
If "%WoTach%" equ "Sa" set "WoTaDe=Samstag"    & set "WoTaEn=Saturday" 
50.
If "%WoTach%" equ "So" set "WoTaDe=Sonntag"    & set "WoTaEn=Sunday" 
51.
if defined WoTaDe goto :allesEasy 
52.
If "%WoTach%" equ "Mon" set "WoTaDe=Montag"     & set "WoTaEn=Monday"  
53.
If "%WoTach%" equ "Thu" set "WoTaDe=Dienstag"   & set "WoTaEn=Tuesday" 
54.
If "%WoTach%" equ "Wed" set "WoTaDe=Mittwoch"   & set "WoTaEn=Wednesday" 
55.
If "%WoTach%" equ "Thu" set "WoTaDe=Donnerstag" & set "WoTaEn=Thursday" 
56.
If "%WoTach%" equ "Fri" set "WoTaDe=Freitag"    & set "WoTaEn=Friday" 
57.
If "%WoTach%" equ "Sat" set "WoTaDe=Samstag"    & set "WoTaEn=Saturday" 
58.
If "%WoTach%" equ "Sun" set "WoTaDe=Sonntag"    & set "WoTaEn=Sunday" 
59.
:allesEasy 
60.
 
61.
:: auf deutsches XP-Date-Format setzen 
62.
:: unused call :SetNewValue    iDate 
63.
call :SetNewValue   sShortdate "dd.MM.yyyy" 
64.
call :SetNewValue   s1159 "" 
65.
call :SetNewValue   s2359 "" 
66.
call :SetNewValue   sTimeFormat "HH:mm:ss" 
67.
 
68.
For /f "delims=" %%i in ('time/t') do set "deTime=%%i" 
69.
For /f "delims=" %%i in ('date/t') do set "deDate=%%i" 
70.
 
71.
:; auf amerkanisches Date-Format setzen 
72.
:: unused call :SetNewValue    iDate 
73.
call :SetNewValue   sShortdate "MM-dd-yyyy" 
74.
call :SetNewValue   s1159 "AM" 
75.
call :SetNewValue   s2359 "PM" 
76.
call :SetNewValue   sTimeFormat "hh:mm:ss tt" 
77.
 
78.
For /f "delims=" %%i in ('time/t') do set "enTime=%%i" 
79.
For /f "delims=" %%i in ('date/t') do set "enDate=%%i" 
80.
 
81.
REM unused call :SetNewValue    iDate 
82.
call :SetNewValue  s1159 "%old_s1159%" 
83.
call :SetNewValue  s2359 "%old_s2359%" 
84.
call :SetNewValue  sTimeFormat "%old_sTimeFormat%" 
85.
call :SetNewValue  sShortdate "%old_sShortDate%" 
86.
 
87.
:: optional ....Summertime.... and the living is easy... 
88.
:: Geht natürlich nur mit Rechten auf HKLM... 
89.
Set regkey="HKLM\System\CurrentControlSet\Control\TimeZoneInformation" 
90.
call :SaveOldValue ActiveTimeBias 
91.
call :SaveOldValue DaylightBias 
92.
call :SaveOldValue StandardName 
93.
call :SaveOldValue DaylightName 
94.
call :SaveOldValue Bias 
95.
If defined old_Bias             Set /a GMTdiff= %old_Bias% / -60 
96.
If defined old_ActiveTimeBias   Set /a Actdiff= %old_ActiveTimeBias% / -60 
97.
If defined old_DayLightBias Set /a UTCdiff= %old_DaylightBias% / -60 
98.
:: ----------- 
99.
:loop 
100.
REM Echo xyDate [xyTime]: %xyDate% [%xytime%] 
101.
REM Echo deDate [deTime]: %deDate% [%detime%] 
102.
REM Echo enDate [entime]: %enDate% [%entime%] 
103.
REM Echo WoTach: [%WoTach%] WoTaDe [%WoTaDe%] WoTaEn: [%WotaEn%] 
104.
If defined ActDiff REM echo Act-Differenz in Stunden plus/minus: [All+%ActDiff%] 
105.
if defined old_StandardName REM Echo Zeitzone: %old_StandardName% 
106.
if defined old_DaylightName REM Echo Sommerzeit: %old_DaylightName% 
107.
If defined GMTDiff REM echo GMT-Differenz in Stunden plus/minus: [GMT+%GMTDiff%] 
108.
If defined UTCDiff REM echo UTC-Differenz in Stunden plus/minus: [UTC+%UTCDiff%] 
109.
REM echo\ 
110.
REM Echo @DaSilva: 
111.
REM echo say Heute ist %WoTach%, der %xyDate% um %xytime% in XY-Land 
112.
echo say Heute ist %WoTaDe%, der %deDate%um %time:~0,8% Uhr (UTC+%ActDiff%) > ZeitDe.cfg 
113.
echo say Today is %WoTaEn%, the %endate%at %EnTime% (UTC+%ActDiff%) > ZeitEn.cfg  
114.
goto display_text 
115.
 
116.
rem // Zeigt das Datum und die Zeit in DOS Fenster an. 
117.
:display_text 
118.
cls 
119.
echo DaSilva Time Script 1.5 activated. Aktuelle Zeit: %WoTaDe%, der %date% %time:~0,8% (UTC+%ActDiff%) 
120.
sleep 1  
121.
rem // hier kannst du die zeitspanne ändern die das script aktualisiert werden soll (1 = 1 Sekunde, 60 = 60 Sekunden) 
122.
goto loop 
123.
 
124.
goto :eof 
125.
 
126.
 
127.
~~~~~~~~~ [End of bätschelchen] 
128.
:SetNewvalue param1=wert param2=value in Anfü-Zeichen 
129.
reg add %regkey% /v "%~1" /d "%~2" /f >nul 
130.
goto :eof 
131.
 
132.
:SaveOldValue param1=regValue  
133.
For /f "tokens=2*" %%i in ('reg query %regkey% /v "%~1" ^2^>nul^|findstr  /i "%~1"') do ( 
134.
    set "old_%1=%%j" 
135.
)  
136.
goto :eof
Wie du siehst läuft es in einer Endlosschleife da die Zeit sekundengenau in der *.cfg landen soll solange das Script läuft. Ist es schlimm, dass dadurch die letzten Zeilen nicht mehr aufgerufen werden?
Zudem noch eine letzte Frage um mich vollkommen glücklich ins Wochenende zu schicken ;)

1. Ist es möglich bei der englischen Uhrzeit auch die Sekunden mit anzugeben (11:52:11 PM)?

Über eine letzte Optimierung aufgrund dieses Scripts würde ich mich sehr freuen. Danke vielmals! Mehr Kompetenz gibt es wohl nicht in diesem Bereich!
Bitte warten ..
Mitglied: Biber
21.06.2008 um 01:15 Uhr
Moin DaSilva,

zu Deiner Frage "Uhrzeit auch mit Sekunden möglich"...

Ich fürchte: Nein.
Jedenfalls nicht ohne nun doch wieder selbst etwas mit Substr-Funktionen zusammenzustoppeln.

Grund ist diese [Disclaimer: Dies ist die ganz persönliche Meinung eines anonym angemeldeten Forenmitglieds und sollte nicht dem Betreiber dieses Forums angelastet werden.] buggybuggybuggy-Implementierung von Bills Bande.

Die Ausgaben von "date/t" und %date% und die Ausgaben von "time/t" und %time% sind nicht gleich.
Beispiel für (deutsche) Zeit:
01.
>time /t & echo %time% 
02.
 1:18 
03.
 1:18:38,97
--->How The ..Kuckuck kommt so etwas durch die Qualitätskontrolle?
Ebenso unglaublich, dass hinter der Ausgabe von "date/t" ein übersehenes Leerzeichen hängt (siehe die Ausgaben in meinem Schnipsel oben).
Praktikantenpfusch.

Anyhow, die Registry-Werte, die wir hier manipulieren, sind immer sofort bei date/t und time/t wirksam... aber bei time/t ist mir keine Holzhammermethode bekannt, mit der ich via Registry die Sekunden mit anzeigen lassen kann.

Eventuell kannst Du es mal versuchen, ob Du über Klickibunti (Einstellungen->Regions- und Spracheinstellungen->Datum und Uhrzeit") eine solche Möglichkeit findest.
Und dann in der Registry nachschauen, was sich geändert hat.

Oder mal abwarten, ob jemand anderes vielleicht mal darüber gestolpert ist und das hier postet.

Zwei Anmerkungen noch zu Deinem Skript:
Die ganzen ausgeREMten Zeilen kannst Du, wenn Du die nicht wegwerfen willst, überspringen,wenn Du in Zeile 99 aus dem ":loop" ein "goto :loop" machst und diese Sprungmarke :loop" nach Zeile 111 setzt.

Und statt "sleep 1" würde ich ein "sleep 30" oder so setzen...
...wir wollen es doch nicht übertreiben.
Hey, ist nur ein Batch... kein Satellitensteuerungsprogramm...

Grüße
Biber
Bitte warten ..
Mitglied: DaSilva
21.06.2008 um 02:06 Uhr
Danke, das wärs dann soweit.
Kann es sein, dass %deDate%, %endate% und %date% zu verschiedenen Uhrzeiten mal ein Leerzeichen vor oder hinter dem eigentlichen Wert haben?
Zuerst hatte ich noch "%deDate% um %time:~0,8%" was dann "20.06.08 um 20:15:00" ergab, dann habe ich es zu "%deDate%um %time:~0,8%" geändert um das doppelte Leerzeichen zu umgehen und jetzt gerade war ein doppeltes Leerzeichen hinter um (oder vor %time:~0,8%) was mich gar zu "%deDate%um%time:~0,8%" bewegte. Jetzt weiß ich noch nicht ob ich mich eben verguckt habe oder ob es mit der Zeit zu tun hat aber jedenfalls ist da irgendwas krumm.
Bei der englischen Zeit dagegen reicht derzeit ein "%endate%at %EnTime%" für die richtige Darstellung ohne zu viele Leerzeichen.
Ist dir da etwas bekannt bzw. kannst du das nachvollziehen?
Bitte warten ..
Mitglied: Biber
21.06.2008 um 13:15 Uhr
Moin DaSilva,

wie geschrieben, ich halte die vorhandene M$-Implementierung der Regions/Spracheinstellungen für suboptimal...
Und Dein wahrgenommenes Phänomen passt zu meiner Wahrnehmung.
Das merkwürdige Leerzeichen nach der "date /t"-Ausgabe hatte ich ja auch schon angesprochen. Wenn das nun auch "nicht immer da ist", dann... na ja, sagen wir so: Kann auch sein, dass ich einen Tippfehler drin habe. Ich werde es noch mal prüfen.
Kann aber auch sein, das M$ einen klitzekleinen Flüchtigkeitsfehler übersehen haben könnte.

A propos Murks:
Ich würde auch gern nachbessern - an einer Stelle habe ich gepennt.
Die Werte s1159 und s2359, die bei Dir als "nicht gefunden" angemeckert wurden:
Fehlinterpretation von mir. Die existieren als REG_SZ, aber die sind {leer}.

Ich ändere deshalb die beiden Call:Blöcke unterhalb des eigentlichen Schnipsels wie folgt:
01.
..... 
02.
... 
03.
~~~~~~~~~ [End of bätschelchen] 
04.
:SetNewvalue param1=wert param2=value in Anfü-Zeichen 
05.
 
06.
If %2=="""" (  
07.
   reg add %regkey% /v "%~1" /f >nul 
08.
) else (    
09.
   reg add %regkey% /v "%~1" /d "%~2" /f >nul 
10.
11.
goto :eof 
12.
 
13.
:SaveOldValue param1=regValue  
14.
For /f "tokens=2*" %%i in ('reg query %regkey% /v "%~1" ^2^>nul^|findstr  /i "%~1"') do ( 
15.
    If "%%j" Equ "" (set old_%1="") else set "old_%1=%%j" 
16.
)  
17.
goto :eof
Lese ich jetzt einen "leeren" Registrywert, dann wird die old_xxx-Variable auch auf "" gesetzt.
Soll ein RegValue auf "leer" gesetzt werden, dann ist die Syntax des Reg.exe-Utilities auch weniger dubios, wenn der /d-Parameter ( /d=fülle mit Daten) ganz weggelassen wird.
Ich ziehe diese Änderung oben im Schnipsel nach.

Einen Nachtrag noch zu dem Time/t-Wert und ob der auch Sekunden anzeigen kann.
Vergiss es. Habe in meinen Akten nachgeschaut.
Der Time/t-Wert wird nur minütlich aktualisiert.
Also ist auf diesem Weg keine Sekunden-Information abgreifbar.

Grüße
Biber
Bitte warten ..
Mitglied: DaSilva
28.06.2008 um 18:40 Uhr
Was mir gerade erst aufgefallen ist:
Die englische Zeit ist eine Stunde früher als die (richtige) deutsche
Zeit.
Eben wurde 15:41:41 und 2:41 PM angezeigt.
Wie kann ich das noch korrigieren?
Danke.
Bitte warten ..
Neuester Wissensbeitrag
Humor (lol)

Linkliste für Adventskalender

(3)

Information von nikoatit zum Thema Humor (lol) ...

Ähnliche Inhalte
Windows 10
gelöst Windows 10 - Datum und Zeitfehler bei Update (3)

Frage von swisstom zum Thema Windows 10 ...

Windows Userverwaltung
gelöst Datum einer Gruppenmitgliedschaft (1)

Frage von slansky zum Thema Windows Userverwaltung ...

Heiß diskutierte Inhalte
Windows Server
DHCP Server switchen (25)

Frage von M.Marz zum Thema Windows Server ...

SAN, NAS, DAS
gelöst HP-Proliant Microserver Betriebssystem (14)

Frage von Yannosch zum Thema SAN, NAS, DAS ...

Grafikkarten & Monitore
Win 10 Grafikkarte Crash von Software? (13)

Frage von Marabunta zum Thema Grafikkarten & Monitore ...

Windows 7
Verteillösung für IT-Raum benötigt (12)

Frage von TheM-Man zum Thema Windows 7 ...