Jump to content
Sign in to follow this  
billyboy

BatchSkript unter Windows XP/2003 - Knobelaufgabe

Recommended Posts

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

Share this post


Link to post
Share on other sites

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-1
Kann sowas gehen?

 

Bestenfalls mit:

 

set Tag=1

set /A Gestern=%Tag%-1

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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%

Share this post


Link to post
Share on other sites

@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:

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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 ;)

Share this post


Link to post
Share on other sites
Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte überlege Dir, ob es nicht sinnvoller ist ein neues Thema zu erstellen.

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this  

Werbepartner:



×
×
  • Create New...