billyboy 10 Geschrieben 9. Juli 2007 Melden Teilen Geschrieben 9. Juli 2007 Ein freundliches Hallo an alle Forums-Mitglieder, ich habe folgenden Effekt in einem Batchskript unter Windows XP / 2003: Habe eine Abfrage für den heutigen und den gestrigen Tag eingebaut. Den heutigen Tag erhalte ich mit set tag=%date:~-10,2% den Vortag mit set /A gestern=tag-1 Heute (09.07.) erhalte ich allerdings für die Variable "gestern" nicht, wie man erwarten würde, den Wert 8, sondern den Wert -1! Habe dann das Problem näher untersucht und ein Skript geschrieben, welches die Zahlen von 1-15 hoch zählt und dann von der Zahl jeweils 1 abzieht. Das Skript sieht in etwa so aus: set Tag=01 set /A Gestern=Tag-1 echo %Gestern% set Tag=02 set /A Gestern=Tag-1 echo %Gestern% set Tag=03 set /A Gestern=Tag-1 echo %Gestern% ... set Tag=11 set /A Gestern=Tag-1 echo %Gestern% set Tag=12 set /A Gestern=Tag-1 echo %Gestern% Nun würde man erwarten, dass in der Ausgabe die Zahlen 0-11 erscheinen. Die Ausgabe sieht aber so aus: 0 1 2 3 4 5 6 -1 -1 9 10 11 Der Set-Befehl rechnet falsch, sobald man von 08 und 09 den Wert 1 abzieht. Dieser Effekt tritt nicht auf, wenn ich die 0 vor den Zahlen 1-9 weglasse. Da ich aber die Werte über die o.g. Datumsfunktion erhalte, enthält die Variable die voranstehende Null. Nun meine beiden Fragen: - Kann mit jemand einen Tipp geben, wie ich in einem Windows Skript die Zahlen von 1-9 mit der o.g. Methode ohne voranstehende 0 bekomme? - Was mich ehrlich gesagt viel mehr interessiert: Kann mir jemand den o.g. Effekt erklären, warum nur bei "08" und "09" falsch gerechnet wird? Schon mal vielen Dank für Eure Zeit und die vielen Antworten ;) Einen schönen Tag noch :D :D Zitieren Link zu diesem Kommentar
lefg 276 Geschrieben 9. Juli 2007 Melden Teilen Geschrieben 9. Juli 2007 Ich meine, das grundsätzliche Problem ist, der Inhalt von %Date% ist ein Text und kein numerisches Datum. Damit ist auch der Extrakt set tag=%date:~-10,2% ein Text, mit diesen sind keine numerischen Operationen möglich. Zu arithmetischen Operationen siehe set /? Liegt es möglicherweise auch an der führenden Null, anderes Zahlensystem. set /A Gestern=Tag-1Kann sowas gehen? Bestenfalls mit: set Tag=1 set /A Gestern=%Tag%-1 Zitieren Link zu diesem Kommentar
Das Urmel 10 Geschrieben 9. Juli 2007 Melden Teilen Geschrieben 9. Juli 2007 warum nur bei "08" und "09" falsch gerechnet wird? Weil das System fälschlicherweise auf Octal schwenkt. :D & völlig aus dem Tritt kommt. Zitieren Link zu diesem Kommentar
billyboy 10 Geschrieben 9. Juli 2007 Autor Melden Teilen Geschrieben 9. Juli 2007 Hallo, herzlichen Dank für die schnellen Antworten. @lefg Bestenfalls mit: set Tag=1 set /A Gestern=%Tag%-1 Ja, es funktioniert auch, wenn ich die Variable ohne %..% angebe. Wenn ich Deinem Vorschlag folge, also aus TAG %TAG% mache, erhalte ich folgende Liste: 0 1 2 3 4 5 6 Ungltige Zahl. Nummerische Konstanten sind entweder dezimale (17), hexadezimale (0x11) oder oktale (021) Zahlen. 6 Ungltige Zahl. Nummerische Konstanten sind entweder dezimale (17), hexadezimale (0x11) oder oktale (021) Zahlen. 6 9 10 11 Zitieren Link zu diesem Kommentar
blub 115 Geschrieben 9. Juli 2007 Melden Teilen Geschrieben 9. Juli 2007 Hi, ich würd mir das Leben einfach machen und eine vbs-Funktion erstellen: cmd-Datei z.B. --------------- @echo off set zahl=07 call cscript //B einsweniger.vbs %zahl% echo %errorlevel% --------------- einsweniger.vbs --------------- x=wscript.arguments(0) x=x-1 wscript.quit(x) ------- oder auch ------- wscript.quit(wscript.arguments(0)-1) ------- liefert auch bei 07 etc. ein vernünftiges Ergebnis cu blub Zitieren Link zu diesem Kommentar
Das Urmel 10 Geschrieben 9. Juli 2007 Melden Teilen Geschrieben 9. Juli 2007 liefert auch bei 07 etc. ein vernünftiges Ergebnis nun schieb noch eines für 08 nach :D :cool: :p Zitieren Link zu diesem Kommentar
Biber 10 Geschrieben 11. Juli 2007 Melden Teilen Geschrieben 11. Juli 2007 Moin billyboy, ich würde mir das Leben auch nicht unnötig schwer machen und Datumsdifferenzen/-berechnungen immer mit einem VBS-Schnipsel abfackeln. Allerdings dann mit den Funktionen DateDiff()/DateAdd(), also direkt mit Datumswerten rechnen. Aber um nochmal auf die "01, 02, ...07, 08, 09. werden Oktalzahlen interpretiert-Problematik zurückzukommen... Du kannst es umgehen, indem Du mit 101, 102...109 "rechnest statt mit 01, 02,..09. Beispiel am CMD-Prompt: >for /L %i in (1,1,31) do @for /f %j in ('@set /a ^(10%i-1^) % 100') do @echo %i -1 = %j 1 -1 = 0 2 -1 = 1 3 -1 = 2 4 -1 = 3 5 -1 = 4 6 -1 = 5 7 -1 = 6 8 -1 = 7 9 -1 = 8 10 -1 = 9 11 -1 = 10 12 -1 = 11 .... ..im Prinzip rechne ich also (bzw. lasse rechnen) Statt: 01 - 1 = 0 --> 101 - 1 mod 100 = 0 Statt: 02 - 1 = 1 --> 102 - 1 mod 100 = 1 Statt: 03 - 1 = 2 --> 102 - 1 mod 100 = 2 usw. usw. ... ..aber hilft Dir alles nicht nicht über den Winter... sobald Du vom ersten des Monat einen Tag abziehen willst, sind die Einsatzmöglichkeiten von "gestern ist heute minus 1" ausgereizt. Ein Beispiel für die Ermittlung des gestrigen Datums im Batch via VBSkript folgt: ::------snipp GesternDemo.bat @echo wscript.echo dateAdd("d",-1, date())>%temp%\gestern.vbs @For /f %%i in ('cscript //nologo %temp%\gestern.vbs') do @set "yesterdate=%%i" @echo [Demo:] Heute ist %date%, gestern war %yesterdate% @del %temp%\gestern.vbs ::---snapp GesternDemo Grüße Biber Zitieren Link zu diesem Kommentar
lefg 276 Geschrieben 12. Juli 2007 Melden Teilen Geschrieben 12. Juli 2007 Falls man tatsäch -warum auch immer- mit dem set /a arbeiten muss, dann lässt man "einfach" die führende Null des Tagesdatums weg und dann funktioniert das auch. Das Weglassen geschieht durch Ersetzen der Null durch ein "Nichts". Prinzipiell ist die Substitution in der Hilfe des Set-Befehls erklärt. Das Ersetzen von Umgebungsvariablen wurde folgendermaáen erweitert: %PATH:str1=str2% Zitieren Link zu diesem Kommentar
Das Urmel 10 Geschrieben 12. Juli 2007 Melden Teilen Geschrieben 12. Juli 2007 @lefg bring doch mal ein Beispiel zur Erläuterung, das hilft ungemein. Anderenfalls höre auf prinzipiell diffuse Statements abzugeben, Bieber hat definitiv mehr drauf als Du und gibt wenigstens eine Lösung, suche mal nach dem Scripter und sei positiv überrascht. Sauer ob deiner last nichtssagenden postings!:mad: Zitieren Link zu diesem Kommentar
Biber 10 Geschrieben 12. Juli 2007 Melden Teilen Geschrieben 12. Juli 2007 Thx @Das Urmel, das erspart es mir die Antwort, die ich grad auf der Tastatur hatte, in vollständiger Wortlänge hier runterzutippen. Ich beschränke mich also auf eine kurze Gegenfrage @lefg: Okay, wenn das einfacher geht... ich lerne ja gern ein paar Tricks dazu. Analog zu billyboyss Vorgehen würde ja zum Beispiel bei der Ermittlung des aktuellen Monats aus der %date%-Variablen herauskommen ( Beispiel am CMD-Prompt): >echo %date:~-7,2% 07 set monat=%date:~-7,2% Bitte ersetze mir mal die führende "0" in dieser Monatsangabe mit dem von Dir genannten Befehl. P.S. Es sollte aber für den Monat Oktober nichts ungeplantes herauskommen.. *gg Grüße Biber Zitieren Link zu diesem Kommentar
blub 115 Geschrieben 13. Juli 2007 Melden Teilen Geschrieben 13. Juli 2007 wenn ihr mit einem Kollegen bzw. mit seinen Posts persönlich unzufrieden seit, dann gibts 3 gute und eine schlechte Variante darauf zu reagieren zuerst die 3 guten 1) Man schreibt dem Kollegen eine PN und klärt das persönlich ab 2) Man wendet sich an den Moderator seines Vertrauens und legt ihm seinen Unmut dar 3) Man verkneift sich eine Antwort bzw. wird in der Antwort nicht persönlich und bleibt auf der sachlichen Ebene und jetzt die am wenigsten gerne gesehene Variante 4) Man greift öffentlich den Poster persönlich an. Das bringt inhaltlich nichts, nur oft genug unschöne Diskussionen . Ich weiss natürlich sehr gut, wie schwer es manchmal ist, auf 4) zu verzichten. Trotzdem die Bitte es zu tun (also das Verzichten :) ) Danke blub Zitieren Link zu diesem Kommentar
Biber 10 Geschrieben 13. Juli 2007 Melden Teilen Geschrieben 13. Juli 2007 Moin blub, hast ja Recht. Dann ziehe ich mene Frage von vorhin zurück. Und liefere noch mal eine Variante mit, um die führende "0" zu entsorgen (Nachzukaspern am CMD-Prompt): (=13:28:17 D:\temp=) >set "monat=%date:~-7,2%" & echo %date:~-7,2%|findstr "^0" && set "monat=%date:~-6,1%" 07 (=13:28:43 D:\temp=) >set monat monat=7 Ist zwar auch wieder ohne die CMD-interne Wechseln/Ersetzen-Funktionalität, aber die wäre für das genannte "Problem" wirklich noch nicht mal ein Plan C oder D bei mir.. ;-) Anyhow, schönes Wochenende Biber Zitieren Link zu diesem Kommentar
lefg 276 Geschrieben 13. Juli 2007 Melden Teilen Geschrieben 13. Juli 2007 Eine schöne Lösung, Respekt. Zitieren Link zu diesem Kommentar
billyboy 10 Geschrieben 14. Juli 2007 Autor Melden Teilen Geschrieben 14. Juli 2007 Hallo, danke für die vielen Vorschläge und die rege Diskussion !! Die VBS-Varianten werde ich mal ausprobieren. Die Skripte sollen aber grundsätzlich auch unter Windows Batch funktionieren. Habe inzwischen auch eine Lösung gefunden :), die man vor der Berechnung des Vortages einsetzt: if %tag% LSS 10 set tag=%tag:~-1% Damit wird für Zahlen kleiner 10 die führende 0 abgeschnitten und Windows kann wieder richtig rechnen ... ;) Ansonsten: Bleibt cool !:cool: Ein bisschen Humor gehört auch in ein solches Forum. Wir sind alle IT-ler und das ist schon schwer genug :D :D :D ;) Zitieren Link zu diesem Kommentar
Zearom 10 Geschrieben 17. Juli 2007 Melden Teilen Geschrieben 17. Juli 2007 mmmh darf man interesse halber fragen was mit dem "script" genau gemacht werden soll? Zitieren Link zu diesem Kommentar
Empfohlene Beiträge
Schreibe einen Kommentar
Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.