Jump to content

BatchSkript unter Windows XP/2003 - Knobelaufgabe


Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Empfohlene Beiträge

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

Link zu diesem Kommentar

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

Link zu diesem Kommentar

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

Link zu diesem Kommentar

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

Link zu diesem Kommentar

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

Link zu diesem Kommentar

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%

Link zu diesem Kommentar

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

Link zu diesem Kommentar

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

Link zu diesem Kommentar

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

Link zu diesem Kommentar

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

Link zu diesem Kommentar
Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Schreibe einen Kommentar

Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor-Fenster leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

×
×
  • Neu erstellen...