GET-DATE-TIME-G von Biber auch mit AM PM Amerikanischen Zeiten mit AM PM in deutschen 24 Stunden umwandeln
Hallo Biber dein Kommentar mann kann auch dir ausgaben übergeben und umwandeln hat zu folgenden Script verleitet.
Ich bekomme logdateien von Verzeichnissen aus der ganzen Welt auch welch hinter dennen AP oder PM steht.
Jetzt habe ich nach dem Script vom Biber GET-DATE-TIME-G noch eine kleine ergänzung geschrieben aber eigentlich wollte ich es in der Subroutine haben .
Aber erste versuche scheiterten
Dieser Quellcode funktioniert.
Jetzt habe ich ihn wie folgt in die Subroutine eingebaut.
Bekomme aber die Fehlermeldung
Fehlere Operator
Also was mache ich falsch
biber du solltest dich doch mit deinem Code an besten auskenne
Ich bekomme logdateien von Verzeichnissen aus der ganzen Welt auch welch hinter dennen AP oder PM steht.
Jetzt habe ich nach dem Script vom Biber GET-DATE-TIME-G noch eine kleine ergänzung geschrieben aber eigentlich wollte ich es in der Subroutine haben .
Aber erste versuche scheiterten
set "m-date="
set "m-time="
set "am-pm="
set "m-file="
echo >dir-aus-amilandin-in-de.txt
for /f "tokens=1-4 " %%a in (dir-aus-amiland.txt) do (
set m-date=%%a
set m-time=%%b
set am-pm=%%c
set m-file= %%c
call :GET-DATE-TIME-G !m-date! !m-time! /s /q
if "!am-pm!"=="PM" (
set /a hh=!hh!+12
If "!hh!"=="24" ( set hh=00)
)
set m-date=!tt!.!mm!.!JJ!
set m-time=!hh!:!min!
echo "!m-date!" "!m-time!" in de.
echo !m-date! !m-time! !m-file >>dir-aus-amilandin-in-de.txt
)
Dieser Quellcode funktioniert.
Jetzt habe ich ihn wie folgt in die Subroutine eingebaut.
:GET-DATE-TIME-G
::-------snipp GetAllDateTimeInfos.bat -----
@ echo off & setlocal
:: v006b Setlocal ohne Zusatz "EnableDelayedExpansion"
:: (c) Biberware 2005 Placed in the Public Domain Oct 2005 for Educational Purposes
:: Ermittelt Datums/Zeitvariable aus dem CMD-Environment und stellt sie als Variablen bereit.
:: Einschränkung: Sollte schon NT oder höher sein. Deshalb die erste Zeile
:: Vers. 0.02 Minor Bugfix; siehe zweiten Kommentar unten. 14.12.2005 by Biber
:: Vers. 0.06a Bugfix/Workarounds für Formfeed-Bug W2K und "Set /a 09"-Bug.
:: -------------- Und alle SETs in Anführungszeichen. Siehe unten. 13.2.2006
:: Vers. 0.06b Aus Kompat-Gründen jetzt ohne erwartete "DelayedExpansion"-Reg-Voreinstellung.
IF NOT "%OS%"=="Windows_NT" echo "%0 läuft nur unter WinNT oder höher. Sorry." && GOTO :eof
If /i [%1]==[/?] goto Syntax
set "us-to-de="
For %%i in ( %1 %2 %3 %4) Do (
If /i [%%i]==[/s] Endlocal
If /i [%%i]==[/u] Endlocal
If /i [%%i]==[/h] goto Syntax
If /i [%%i]==[PM] set us-to-de=1
)
SET "AllDateTimeVars=DateOrder KW OSKW DoW DoY cDoW DD TT MM JJ YY hh min ss ms"
FOR %%i in (%AllDateTimeVars%) do @if defined %%i set "%%i="
:: Datum will ich OHNE Wochentag haben. Zwischenschritt mit INDate
:: erweitert, Parameter erlaubt.. Param1=Datumswert;Param2=Zeit
For %%i in (%1 %2 %3) Do If /i %%i==/u goto :Cleanup
Set "INDate=%date%"
Set "INTime=%time%"
If NOT [%1]== If /i [%1] NEQ [/q] If /i [%1] NEQ [/s] set "INDate=%1"
If NOT [%2]== If /i [%2] NEQ [/q] If /i [%2] NEQ [/s] set "INTime=%2"
:: Die nächste Code-Zeile ändert nur dann etwas, wenn ein Wochentag mitgeliefert wird.
:: Aus "Sa 01.10.2005" wird dann "01.10.2005"
FOR /F "tokens=2" %%i in ("%INDate%") do Set "INDate=%%i"
:: Beschränkung auf existierende Datumsformate siehe Posting mit CAT unten.
:: Das Format "Mo, 13. Februar 2006" mit zwei Leerzeichen würde NICHT funktionieren!
FOR /F "tokens=1-7 delims=:/.-, " %%i in ("%INDate% %INTime%") do (
FOR /F "tokens=2-4 delims=/-,() skip=1" %%a in ('echo.^|date') do (
for %%@ in ("DateOrder=%%a-%%b-%%c" "%%a=%%i" "%%b=%%j" "%%c=%%k" "hh=%%l" "min=%%m" "ss=%%n" "ms=%%o") do set %%@
)
)
For %%i in (ss ms) do if not defined %%i set "%%i=00"
:: ----- v005 Workaround wegen W2K-Formfeed-Bug: Kommata als Deliniter im VBS-Schnipsel-Output.
SET "vbsSnippet=%temp%\%random%.vbs"
echo If wscript.arguments.count = 1 Then dDate=wscript.arguments.item(0) Else dDate=Date>%vbssnippet%
echo Wscript.Echo "x," ^& DatePart("ww",dDate,vbSunday,vbFirstFourDays) ^& "," ^&_>>%vbsSnippet%
echo DatePart("ww",dDate) ^& "," ^& DatePart("w",dDate) ^& "," ^& DatePart("y",dDate)>>%vbsSnippet%
for /F "delims=, tokens=2-5" %%a in ('cscript //nologo %vbsSnippet% %INDate%') do (
(Set "KW=%%a" ) && Rem Kalenderwoche nach verbreiteter Berechnung
(Set "OSKW=%%b" ) && Rem Kalenderwoche nach Betriebssystemvorgaben nicht über GUI änderbar! *lacht
(Set "DoW=%%c" ) && Rem Day of Week 1=Sonntag, 2= Montag... bei meinen REG-Settings
(Set "DoY=%%d" ) && Rem Day of Year, Kalendertag
)
del %vbssnippet%
:: Tag, Monat und Stunde möchte ich immer zweistellig haben, also mit führender "0"
:: v006-Fix<s>For %%i in (DD TT MM hh) DO IF DEFINED %%i Set /a %%i+=100 </s>
:: v006-Fix wg. Set /A-Bug. THX an superfrog für den Bugreport.
:: v006b-Fix-Fix <s>For %%i in (DD TT MM hh) DO IF DEFINED %%i Set "%%i=10!%%i!"</s>
:: --- für die beiden Fixes siehe die Kommentare von superfrog unten -- 14.2.2006
IF defined DD Set "DD=10%DD%"
IF defined TT Set "TT=10%TT%"
IF defined MM Set "MM=10%MM%"
IF defined hh Set "hh=10%hh%"
:: -v006b ----Vier Zeilen ohne DeleayEnpansion statt eine FOR..IN..DO-Anweisung
set "hh=%hh:~-2,2%"
set "MM=%MM:~-2,2%"
:: ... und den Wochentag will ich auch, wenigstens in zwei Sprachen.
IF defined DD (
set "DD=%DD:~-2,2%"
IF %DoW%==1 Set "cDow=Sun"
IF %DoW%==2 Set "cDow=Mon"
IF %DoW%==3 Set "cDow=Tue"
IF %DoW%==4 Set "cDow=Wed"
IF %DoW%==5 Set "cDow=Thu"
IF %DoW%==6 Set "cDow=Fri"
IF %DoW%==7 Set "cDow=Sat"
)
IF defined TT (
set "TT=%TT:~-2,2%"
IF %DoW%==1 Set "cDow=So"
IF %DoW%==2 Set "cDow=Mo"
IF %DoW%==3 Set "cDow=Di"
IF %DoW%==4 Set "cDow=Mi"
IF %DoW%==5 Set "cDow=Do"
IF %DoW%==6 Set "cDow=Fr"
IF %DoW%==7 Set "cDow=Sa"
)
:: so.. hier schlampe ich mal..
:: alle 2-stelligen Jahre kleiner 39 werden zu 2001...2038
:: alle 2-stelligen Jahre größer gleich 39 und kleiner gleich 99 werde zu 1939 bis 1999
IF not defined YY goto YYskip
IF %YY% LSS 39 set "YY=20%YY%"
IF %YY% LEQ 99 set "YY=19%YY%"
:YYskip
If not defined JJ goto JJskip
IF %JJ% LSS 39 set "JJ=20%JJ%"
IF %JJ% LEQ 99 set "JJ=19%JJ%"
:JJskip
IF defined YY set "JJ=%YY%"
IF defined JJ set "YY=%JJ%"
IF defined DD Set "TT=%DD%"
IF defined TT Set "DD=%TT%"
:: Lass sehen, was wir haben....falls kein Parameter /q
For %%i in (%1 %2 %3 %4) Do If /i %%i==/q goto cleanUp
For %%i in (INDate INTime %AllDateTimeVars%) do @if defined %%i set %%i
if "%us-to-de%"=="1" (
set /a hh=!hh!+12
If "!hh!"=="24" ( set hh=00)
)
:cleanUp
For %%i in (vbssnippet INTime INDate) Do Set "%%i="
goto :eof
:Syntax
ECHO.
ECHO %~nx0 By Frank / dem Biber aus Bremen 2005
ECHO.
ECHO Ermittelt strukturierte Informationen über Datum und Zeit
ECHO Angezeigt oder optional in Variablen gesetzt werden:
ECHO %AllDateTimeVars%
ECHO.
Echo Syntax:
ECHO %~nx0 [Datum] [Zeit] [/s^|/u] [/q] [/?]
ECHO.
ECHO Datum Datumswert wie vom System oder der Dir-Ausgabe geliefert.
ECHO Default Systemdatum.
ECHO Zeit Zeit wie vom System oder der Dir-Ausgabe geliefert. Default Systemzeit
ECHO /s SET Setzt die oben genannten Umgebungsvariablen
ECHO /u UNSET Löscht die gesetzten Umgebungsvariablen
ECHO /q QUIET Unterdrückt die Bildschirmanzeige der ermittelten Werte
ECHO. /^? Zeigt diese schöne Hilfe
Goto :eof
Bekomme aber die Fehlermeldung
Fehlere Operator
Also was mache ich falsch
biber du solltest dich doch mit deinem Code an besten auskenne
Please also mark the comments that contributed to the solution of the article
Content-ID: 120652
Url: https://administrator.de/contentid/120652
Printed on: December 10, 2024 at 15:12 o'clock
9 Comments
Latest comment
Moin mycroftone,
soweit ich es nachvollziehen kann, ist es für Dich doch gar nicht nötig, meinen Datumszerbröselschnipsel aufzurufen.
Bzw. ich sehe 3 mögliche Strategien.
Strategie a) Du machst alles in Deiner Batch - ohne aufwändige Datumszerlege-Subroutine
Die Konvertierung Deiner catalogo milano-Textdatei bekommst Du doch problemlos mit Deinem eigenen Schnipsel hin.
Bzw. die kleine Arbeit, die ich Dir dadurch abnehme, dass ich die "Stunden" schon als Variable %hh% liefere...
Ja hey! das bekommen wir auch mit einer viel viel kleineren FOR /F Anweisung hin.
Poste doch mal bitte 3 oder 5 Zeilen Deiner Mailänder DIR-Liste, und darunter den Soll-Output, dann entwickeln wir das hier.
Strategie b) Deine Batchdatei ruft "meine" Batchdatei.
Nächstdümmere Alternative wäre, die GetAllDateTimeInfos.bat als (separate) Batchdatei aufzurufen,
diese aber um einen optionalen dritten Parameter (AM_PM) zu erweitern... [unterstellt, dass in 95%der Fälle auch nur "AM" und "PM" drinstehen.].
Denn das Umrechnen auf 24h-Format (sprich: ggf. 12 Stunden addieren, wenn es nach dem Frühstück ist), das wäre ja genau das, was der Schnipsel vorgegeben hat leisten zu können ("beliebige Datums-/Zeitformate zu vereinheitlichen")
Strategie c)
Allerdings würde bei einer Umwidmung der bisher eigenständigen Batchdatei zu einer geCALLten Unterroutine (also Deinem eigentlichen Ziel)möglicherweise ein bisschen mehr zu ändern und zu testen sein (insbesondere die Mimik mit globalen/lokalen Veriablen.
Strategie A) erscheint mir die einfachste für diese Aufgabe.
Strategie B) hat den Reiz, die GetAllDateTimeInfos.bat noch um diese AM/PM-Erkennung zu erweitern.... okay.
Ist aber für Dein Vorhaben auch total überdimensioniert.
--> von C) würde ich abraten... da ist der Aufwand nicht vertretbar.
Und es läuft meiner Absicht zuwider, auch mal wiederverwendbare/allgemein verwendbare Beispielschnipsel zu posten.
Lass uns doch mal A (oder wenn nix im Fernsehen kommt auch B) versuchen.
Siehe oben:
Grüße
Biber
soweit ich es nachvollziehen kann, ist es für Dich doch gar nicht nötig, meinen Datumszerbröselschnipsel aufzurufen.
Bzw. ich sehe 3 mögliche Strategien.
Strategie a) Du machst alles in Deiner Batch - ohne aufwändige Datumszerlege-Subroutine
Die Konvertierung Deiner catalogo milano-Textdatei bekommst Du doch problemlos mit Deinem eigenen Schnipsel hin.
Bzw. die kleine Arbeit, die ich Dir dadurch abnehme, dass ich die "Stunden" schon als Variable %hh% liefere...
Ja hey! das bekommen wir auch mit einer viel viel kleineren FOR /F Anweisung hin.
Poste doch mal bitte 3 oder 5 Zeilen Deiner Mailänder DIR-Liste, und darunter den Soll-Output, dann entwickeln wir das hier.
Strategie b) Deine Batchdatei ruft "meine" Batchdatei.
Nächstdümmere Alternative wäre, die GetAllDateTimeInfos.bat als (separate) Batchdatei aufzurufen,
diese aber um einen optionalen dritten Parameter (AM_PM) zu erweitern... [unterstellt, dass in 95%der Fälle auch nur "AM" und "PM" drinstehen.].
Denn das Umrechnen auf 24h-Format (sprich: ggf. 12 Stunden addieren, wenn es nach dem Frühstück ist), das wäre ja genau das, was der Schnipsel vorgegeben hat leisten zu können ("beliebige Datums-/Zeitformate zu vereinheitlichen")
Strategie c)
Allerdings würde bei einer Umwidmung der bisher eigenständigen Batchdatei zu einer geCALLten Unterroutine (also Deinem eigentlichen Ziel)möglicherweise ein bisschen mehr zu ändern und zu testen sein (insbesondere die Mimik mit globalen/lokalen Veriablen.
Strategie A) erscheint mir die einfachste für diese Aufgabe.
Strategie B) hat den Reiz, die GetAllDateTimeInfos.bat noch um diese AM/PM-Erkennung zu erweitern.... okay.
Ist aber für Dein Vorhaben auch total überdimensioniert.
--> von C) würde ich abraten... da ist der Aufwand nicht vertretbar.
Und es läuft meiner Absicht zuwider, auch mal wiederverwendbare/allgemein verwendbare Beispielschnipsel zu posten.
Lass uns doch mal A (oder wenn nix im Fernsehen kommt auch B) versuchen.
Siehe oben:
Poste doch mal bitte 3 oder 5 Zeilen Deiner Mailänder DIR-Liste, und darunter den Soll-Output, dann entwickeln wir das hier.
Grüße
Biber
Moin mycroftone,
immer der Reihe nach... erst mal Strategie 1, dann schauen wir, ob wir mehr brauchen.
Wenn ich Dich richtig verstanden habe, dann liegen die LogFiles als einzelne Dateien getrennt voneinander vor.
Vereinfacht ausgedrückt, bei Dir liegt irgendwie irgendwie eine Datei
Im Fall Russland habe ich gar kein Problem, die einzelnen Zeilen-Bestandteile
zuzuordnen oder auch neu anzuordnen:
[Text am CMD-Prompt; das ">" am Zeilenanfang nicht mit eingeben.]
Wenn Du lieber dieses Format haben willst
Fettich.
Im Falle "Indien" wird es nun auch nicht soooooo komplex.
Ein erstes Antesten liefert:
Das heißt, hier ist abhängig von 6.Token/Variable %f eine Addition von 12 Stunden auf den %hh% Wert nötig
Diesen Rest mache ich jetzt mal in einer Batchdatei, weil die Darstellung von längeren Befehlszeilen hier im Forum nur suboptimal unterstützt wird.
Also: Batchdatei namens TestIndien.cmd.
Ausgabe des Testschnipsels:
Also.... ich sehe keine Notwendigkeit einer noch aufwändigeren Datumszerlegung.
PS. Und hier hast Du mich falsch verstanden.
Sondern eher die Schnipsel so variabel lassen, dass sie für verschiedene Gelegenheiten verwendet werden können.
Grüße
Biber
immer der Reihe nach... erst mal Strategie 1, dann schauen wir, ob wir mehr brauchen.
Wenn ich Dich richtig verstanden habe, dann liegen die LogFiles als einzelne Dateien getrennt voneinander vor.
Vereinfacht ausgedrückt, bei Dir liegt irgendwie irgendwie eine Datei
- "Indien_Juli2009.txt" oder so ähnlich mit Inhalt
07/17/2009 12:46 AM <DIR> PROD_Archiv_0309_
07/19/2009 11:45 PM <DIR> PROD_Archiv_0509_
07/18/2009 04:45 PM <DIR> PROD_Archiv_0609_
.....
- und eine "Russland_2008" oder so mit Inhalt
06.02.2008 16:02 <DIR> PROD_DATA_1007_
06.03.2008 23:02 <DIR> PROD_DATA_1107_
06.04.2008 11:02 <DIR> PROD_DATA_0907_
Im Fall Russland habe ich gar kein Problem, die einzelnen Zeilen-Bestandteile
zuzuordnen oder auch neu anzuordnen:
[Text am CMD-Prompt; das ">" am Zeilenanfang nicht mit eingeben.]
>type e:\work\Russland_2008.txt
06.02.2008 16:02 <DIR> PROD_DATA_1007_
06.03.2008 23:02 <DIR> PROD_DATA_1107_
06.04.2008 11:02 <DIR> PROD_DATA_0907_
(=17:06:52 D:\temp=)
>for /F "tokens=1-4,6* delims=/. " %a in (e:\work\Russland_2008.txt) do @echo TT[%a] MM[%b] JJJJ[%c] zeit[%d] Dirname[%e]
TT[06] MM[02] JJJJ[2008] zeit[16:02] Dirname[PROD_DATA_1007_]
TT[06] MM[03] JJJJ[2008] zeit[23:02] Dirname[PROD_DATA_1107_]
TT[06] MM[04] JJJJ[2008] zeit[11:02] Dirname[PROD_DATA_0907_]
Wenn Du lieber dieses Format haben willst
Russland PROD_DATA_0907_ vom 06.04.2008 11:02"
...okay:>for /F "tokens=1-4,6* delims=/. " %a in (e:\work\Russland_2008.txt) do @echo Russland %e %a.%b.%c %d
Russland PROD_DATA_1007_ 06.02.2008 16:02
Russland PROD_DATA_1107_ 06.03.2008 23:02
Russland PROD_DATA_0907_ 06.04.2008 11:02
Im Falle "Indien" wird es nun auch nicht soooooo komplex.
Ein erstes Antesten liefert:
>for /F "tokens=1-6,8* delims=/.: " %a in (e:\work\indien_2009.txt) do @echo MM[%a] TT[%b] JJJJ[%c] hh[%d] mm[%e] AMPM[%f] Dirname [%g]
MM[07] TT[17] JJJJ[2009] hh[12] mm[46] AMPM[AM] Dirname [PROD_Archiv_0309_]
MM[07] TT[19] JJJJ[2009] hh[11] mm[45] AMPM[PM] Dirname [PROD_Archiv_0509_]
MM[07] TT[18] JJJJ[2009] hh[04] mm[45] AMPM[PM] Dirname [PROD_Archiv_0609_]
Das heißt, hier ist abhängig von 6.Token/Variable %f eine Addition von 12 Stunden auf den %hh% Wert nötig
Diesen Rest mache ich jetzt mal in einer Batchdatei, weil die Darstellung von längeren Befehlszeilen hier im Forum nur suboptimal unterstützt wird.
Also: Batchdatei namens TestIndien.cmd.
::--- TestIndien
@echo off & setlocal EnableDelayedExpansion
for /F "tokens=1-6,8* delims=/.: " %%a in (e:\work\indien_2009.txt) do (
echo ---test--1- ] MM[%%a] TT[%%b] JJJJ[%%c] hh[%%d] mm[%%e] AMPM[%%f] Dirname [%%g]
if [%%f]==[AM] (
Set "HH=%%d"
) Else (
If [%%d]==[00] Set "hh=12"
If [%%d]==[01] Set "hh=13"
If [%%d]==[02] Set "hh=14"
If [%%d]==[03] Set "hh=15"
If [%%d]==[04] Set "hh=16"
If [%%d]==[05] Set "hh=17"
If [%%d]==[06] Set "hh=18"
If [%%d]==[07] Set "hh=19"
If [%%d]==[08] Set "hh=20"
If [%%d]==[09] Set "hh=21"
If [%%d]==[10] Set "hh=22"
If [%%d]==[11] Set "hh=23"
If [%%d]==[12] Set "hh=00"
)
echo ---test--2- formatierte Zeile:
Echo Indien %%g %%b.%%a.%%c !hh!:%%e
)
Ausgabe des Testschnipsels:
>e:\work\TestIndien
---test--1- ] MM[07] TT[17] JJJJ[2009] hh[12] mm[46] AMPM[AM] Dirname [PROD_Archiv_0309_]
---test--2- formatierte Zeile:
Indien PROD_Archiv_0309_ 17.07.2009 12:46
---test--1- ] MM[07] TT[19] JJJJ[2009] hh[11] mm[45] AMPM[PM] Dirname [PROD_Archiv_0509_]
---test--2- formatierte Zeile:
Indien PROD_Archiv_0509_ 19.07.2009 23:45
---test--1- ] MM[07] TT[18] JJJJ[2009] hh[04] mm[45] AMPM[PM] Dirname [PROD_Archiv_0609_]
---test--2- formatierte Zeile:
Indien PROD_Archiv_0609_ 18.07.2009 16:45
Also.... ich sehe keine Notwendigkeit einer noch aufwändigeren Datumszerlegung.
PS. Und hier hast Du mich falsch verstanden.
Wenn du aber meinst du willst hier keine Batchsnipsel Posten die Allgemeingültig von jeden verwendet werden können
Doch doch, will ich durchaus.... ich will nur nicht bereits "fertige" Schnipsel noch mal für diesen oder jenen Spezialfall anpassen.Sondern eher die Schnipsel so variabel lassen, dass sie für verschiedene Gelegenheiten verwendet werden können.
Grüße
Biber
Moin mycroftone,
okay, diese mögliche AMPM-Format-Information lässt sich sicherlich noch relativ stressarm einbauen.
Das ist die gute Nachricht
Weite unten kommt aber noch eine schlechte.
Zu berücksichtigen ist ja nur, dass die bisherige GetAllDateTimeInfos.bat [oder .cmd] JETZT max 5 Parameter erwartet.
Syntax jetzt: <batname> [Datum] [Zeit] [/s|/u] [/q] [/?]
--> also bei sinnvollem Aufrufen maximal die Parameter datum zeit /setzeGlobaleVars /quaknichrumdabei
[Beispiel] getAllDatetimeInfos 11.11.2009 10:27 /s /q [/Beispiel]
Das wäre jetzt zu erweitern auf einen weiteren [optionalen] Parameter
--> somit bei sinnvollem Aufrufen maximal die Parameter datum zeit AmPm /setzeGlobaleVars /quaknichrumdabei
--> Todo:
a) Dort wo jetzt bei der Parameterprüfung bzw bei Erkennung der Steuerungsschalter (/s /q /u ) bisher steht:
b) in der Aufzählung
c)
30.FOR %%i in (%AllDateTimeVars%) do @if defined %%i set "%%i=" 31.:: Datum will ich OHNE Wochentag haben. Zwischenschritt mit INDate 32. 33.:: erweitert, Parameter erlaubt.. Param1=Datumswert;Param2=Zeit 34.For %%i in (%1 %2 %3) Do If /i %%i==/u goto :Cleanup
35.Set "INDate=%date%"
36.Set "INTime=%time%"
nach den jetzigen Zeilen 38/39 oben im Schnipsel sollte eine neue Zeilen folgen.
(somit ist gesichert, dass bei fehlendem "AM" oder "PM"-Parameter "AM" gilt. Und "AM" bedeutet ja: "Addiere KEINE 12 Stunden zu irgendwas.")
d)
Bei der "Addition von 12 Stunden gibt es mehrere Wege.
d1) Den einleuchtenderen und schlankeren, den Du gewählt hast ("Rechne Stunde = Stunde plus 12").
Dabei hält allerdings die CMD.exe bzw. der Set /A-Befehl noch ein paar Überraschungen bereit.
Z.B wenn Du von "08:00 PM" auf unser deutsches Tagesschau-Zeitformat 20.00 gehen willst.
-> ein "Set /a 08 + 12" bringt leider nicht auf Anhieb 20, sondern erstmal einen Syntaxfehler. Probier es einfach.
d2) Weil ich da gar nicht mit der CMD.exe diskutieren wollte habe ich oben den etwas unbeholfeneren Copy&Paste-Weg skizziert.
Dieses umständliche "....If [%%d]==[01] Set "hh=13" .... If [%%d]==[06] Set "hh=18" If [%%d]==[12] Set "hh=00"....."
Sieht albern aus, ist aber lesbar und wartbar.
e) die Hilfe zur Syntax muss angepasst werden.
Das wars.
Jetzt die schlechte Nachricht.
Da die GetAllDatetimeInfo das Datums/Zeitformat des Rechners bzw des angemeldeten Users zugrundelegt,
wird sie im Falle "indisches DIR-Ausgabeformat" NICHT erkennen können, dass das Datum im Format "MM/TT/JJJJ" kommt.
Jedenfalls nicht, wenn auf Deinem Rechner eingestellt ist "TT.MM.JJJJ"
Hier musst du auf jeden fall vorher eingreifen und in einer FOR/F-Anweisung ein bisschen umsortieren.
Aber das hatten wir ja oben schon.
Einen Vorteil für Deine Verarbeitung sehe ich durch den Aufruf der GetAllDateTimeInfos nach wie vor nicht.
Okay, Du könntest noch bei jeder aufbereiteten Zeile mit dazu schreiben, welcher Wochentag es war oder welche KW.
Na ja, das musst Du abwägen, welcher Aufwand vertretbar ist.
Und üben tut es allemal.
Grüße
Biber
okay, diese mögliche AMPM-Format-Information lässt sich sicherlich noch relativ stressarm einbauen.
Das ist die gute Nachricht
Weite unten kommt aber noch eine schlechte.
Zu berücksichtigen ist ja nur, dass die bisherige GetAllDateTimeInfos.bat [oder .cmd] JETZT max 5 Parameter erwartet.
Syntax jetzt: <batname> [Datum] [Zeit] [/s|/u] [/q] [/?]
--> also bei sinnvollem Aufrufen maximal die Parameter datum zeit /setzeGlobaleVars /quaknichrumdabei
[Beispiel] getAllDatetimeInfos 11.11.2009 10:27 /s /q [/Beispiel]
Das wäre jetzt zu erweitern auf einen weiteren [optionalen] Parameter
--> somit bei sinnvollem Aufrufen maximal die Parameter datum zeit AmPm /setzeGlobaleVars /quaknichrumdabei
--> Todo:
a) Dort wo jetzt bei der Parameterprüfung bzw bei Erkennung der Steuerungsschalter (/s /q /u ) bisher steht:
For %%i in ( %1 %2 %3 %4) Do ( .......
Muss jetzt ein Parameter mehr geprüft werden:For %%i in ( %1 %2 %3 %4 %5) Do (
b) in der Aufzählung
SET "AllDateTimeVars=DateOrder KW OSKW DoW DoY cDoW DD TT MM JJ YY hh min ss ms"
sollte eine weitere variable AMPM aufgenommen werdenSET "AllDateTimeVars=DateOrder KW OSKW DoW DoY cDoW DD TT MM JJ YY hh min ss ms AMPM"
c)
30.FOR %%i in (%AllDateTimeVars%) do @if defined %%i set "%%i=" 31.:: Datum will ich OHNE Wochentag haben. Zwischenschritt mit INDate 32. 33.:: erweitert, Parameter erlaubt.. Param1=Datumswert;Param2=Zeit 34.For %%i in (%1 %2 %3) Do If /i %%i==/u goto :Cleanup
35.Set "INDate=%date%"
36.Set "INTime=%time%"
nach den jetzigen Zeilen 38/39 oben im Schnipsel sollte eine neue Zeilen folgen.
38.If NOT [%1]== If /i [%1] NEQ [/q] If /i [%1] NEQ [/s] set "INDate=%1"
39.If NOT [%2]== If /i [%2] NEQ [/q] If /i [%2] NEQ [/s] set "INTime=%2"
--> neu: If [%3]==[PM] set "AMPM=PM" else Set "AMPM=AM"39.If NOT [%2]== If /i [%2] NEQ [/q] If /i [%2] NEQ [/s] set "INTime=%2"
(somit ist gesichert, dass bei fehlendem "AM" oder "PM"-Parameter "AM" gilt. Und "AM" bedeutet ja: "Addiere KEINE 12 Stunden zu irgendwas.")
d)
Bei der "Addition von 12 Stunden gibt es mehrere Wege.
d1) Den einleuchtenderen und schlankeren, den Du gewählt hast ("Rechne Stunde = Stunde plus 12").
Dabei hält allerdings die CMD.exe bzw. der Set /A-Befehl noch ein paar Überraschungen bereit.
Z.B wenn Du von "08:00 PM" auf unser deutsches Tagesschau-Zeitformat 20.00 gehen willst.
-> ein "Set /a 08 + 12" bringt leider nicht auf Anhieb 20, sondern erstmal einen Syntaxfehler. Probier es einfach.
d2) Weil ich da gar nicht mit der CMD.exe diskutieren wollte habe ich oben den etwas unbeholfeneren Copy&Paste-Weg skizziert.
Dieses umständliche "....If [%%d]==[01] Set "hh=13" .... If [%%d]==[06] Set "hh=18" If [%%d]==[12] Set "hh=00"....."
Sieht albern aus, ist aber lesbar und wartbar.
e) die Hilfe zur Syntax muss angepasst werden.
Das wars.
Jetzt die schlechte Nachricht.
Da die GetAllDatetimeInfo das Datums/Zeitformat des Rechners bzw des angemeldeten Users zugrundelegt,
wird sie im Falle "indisches DIR-Ausgabeformat" NICHT erkennen können, dass das Datum im Format "MM/TT/JJJJ" kommt.
Jedenfalls nicht, wenn auf Deinem Rechner eingestellt ist "TT.MM.JJJJ"
Hier musst du auf jeden fall vorher eingreifen und in einer FOR/F-Anweisung ein bisschen umsortieren.
Aber das hatten wir ja oben schon.
Einen Vorteil für Deine Verarbeitung sehe ich durch den Aufruf der GetAllDateTimeInfos nach wie vor nicht.
Okay, Du könntest noch bei jeder aufbereiteten Zeile mit dazu schreiben, welcher Wochentag es war oder welche KW.
Na ja, das musst Du abwägen, welcher Aufwand vertretbar ist.
Und üben tut es allemal.
Grüße
Biber