CMD Numerische Konstante Fehler?
Ich habe mir ein Skript geschrieben, dass jeden Tag automatisch den richtigen Bericht öffnet. Das ist alle zwei Wochen eine Nummer mehr. Hat jetzt einen Monat ohne Probleme funktioniert. Heute hat er aber den Bericht von letzer Woche geöffnet. Gestern hatte er den richtigen. Ich hoffe ihr könnt anhand des Codes und es Fehlers sagen, wo das Problem liegt. Bin Systemintegrator in der Ausbildung. Kenne mich also ein ganz kleines bisschen mit programmieren aus. Ich glaube das ist ein total dämlicher Fehler. Aber ich finde ihn nicht. In der Berufsschule lerne ich übrigens Python. Deswegen kenne ich mich mit cmd kaum aus. Brauche ich ja eigentlich auch nicht für den Berufsalltag.
Hier der Code:
echo off
set jahr=%date:~-4%
echo Heute ist der %date%
if '%jahr%'=='2020' goto 2020
echo Es gibt keinen vorgefertigten Bericht mehr
Timeout /t 20
:2020
setlocal
chcp 1252>nul
REM KalenderWoche (Mo-SO)
REM Datum
set /A d=%date:~0,2%
set /A m=%date:~3,2%
set /A y=%date:~6,4%
REM Tag des Jahres
if %m% == 1 set /A DoY=d
if %m% == 2 set /A DoY=d+31
if %m% == 3 set /A DoY=d+59
if %m% == 4 set /A DoY=d+90
if %m% == 5 set /A DoY=d+120
if %m% == 6 set /A DoY=d+151
if %m% == 7 set /A DoY=d+181
if %m% == 8 set /A DoY=d+212
if %m% == 9 set /A DoY=d+243
if %m% == 10 set /A DoY=d+273
if %m% == 11 set /A DoY=d+304
if %m% == 12 set /A DoY=d+334
REM Schaltjahr?
set /A LY=(y/4)*4
if %y% NEQ %LY% goto noLY
if %m% GTR 2 set /A DoY=DoY+1
:noLY
REM Tag der Woche (Sonntag = 0)
for /f %%g in ('wmic path win32_localtime get dayofweek^|findstr /v /r "^$"') do (set DoW=%%g)
REM (Sonntag = 7)
if %DoW% == 0 set /A DoW=7
REM KW
set /A nSd=DoY+(7-DoW)
set /A KW=nSd/7
set /A delta=nSd-(KW*7)
if %delta% GTR 3 set /A KW=KW+1
REM Ausgabe der aktuellen KW
echo Wir sind in der %KW%. Kalenderwoche
REM Nummer des Berichts errechnen und richtigen Bericht öffnen
set /A Nummer=(KW+73)/2
echo Bericht: %Nummer%.docx
echo Fenster kann geschlossen werden oder wird geschlossen wenn der Bericht geschlossen wird.
chcp 850>nul
start winword.exe "G:\DATEN\Dez1\FD102\IuK\Azubis\"Mein Name"\Berichte\2020\%Nummer%.docx"
timeout /t 20
endlocal
exit
Und die Ausgabe mit der Fehlermeldung:
Heute ist der 08.05.2020
Ungültige Zahl. Numerische Konstanten sind entweder dezimale (17),
hexadezimale (0x11) oder oktale (021) Zahlen.
Wir sind in der 18. Kalenderwoche
Bericht: 45.docx
Fenster kann geschlossen werden oder wird geschlossen wenn der Bericht geschlossen wird.
Gewartet wird 17 Sekunden. Weiter mit beliebiger Taste...
1 Antwort
Bin Systemintegrator in der Ausbildung
...auf jeden Fall schon mal hübscherer Code al die meisten hier vorlegen...👍
Es ist noch kein Meister vom Himmel gefallen und selbst ich (mit 30 Jahren Erfahrung) verfange mich gelegentlich in den Fallstricken von Batch🤮
- Deine Variante des Zerlegens des Datum erzeugt Zahlen mit führenden 0 (01 bis 09)
- Zahlen mit führender 0 werden als Oktalzahlen angesehen.
- das Oktalsystem erlaub jedoch nur die Ziffern 0 bis 7.
und da liegt der Hase im Pfeffer ... heute ist der 08. eine Zahl die es im Oktalsystem nicht gibt da bleibt nur warten bis 10.10.🥱 also Geduld 😴 ...
...war Spaß 😁, Du verwendest bereits wmic path win32_localtime , da war es garnicht nötig die Stringzerlegung von %Date% heranzuziehen...
Ich habe mir einfach mal erlaubt das einholen der Datumsinformationen an den Anfang zu verlegen , den Umfang der abgefragten Parameter etwas zu erweitern und die Ergebnisse direkt in aussagekräftige Variablen umzuwandeln.
win32_localtime.cmd
for /f "tokens=* " %%a in ('wmic path win32_localtime get Day^,DayOfWeek^,Hour^,Minute^,Month^,Quarter^,Second^,WeekInMonth^,Year /format:list^|find "="') do (
set "__%%~a"
)
set __
pause
(wundere dich nicht über das find "=" . WMIC beendet Zeilen mit nacktem 0AHex der For-loop hängt einen MicrosoftZeilenvorschub (0A0D) an. Es entstünden keine normalen Leerzeilen , welche normalerweise vom For-Loop gefressen werden und es gäbe Gemecker ohne Ende )
- ...besser "man hat" als "man hätte" die paar Extravariablen fressen kein Brot...
- Dein If-Monster in der Mitte habe ich auf 4 Zeilen (netto) eingedampft .
- Die Umschalterei zwischen codepage 1254 und 850 machte keinen Sinn (stattdessen schalte ich einmal auf Unicode, dan kannst Du ohne Verrenkungen Umlaute verwenden ---Script im Notepadstandard speichern (UTF-8 !ohne BOM!) )
die überarbeitete Batch:
@echo off
setlocal enableDelayedexpansion
chcp 65001 >nul & rem UTF-8 Zeichen richtig darstellen (erlaubt Umlaute usw.)
rem hole alle nötigen Daten (und einige mehr) auf einen Rutsch
for /f "tokens=* " %%a in ('wmic path win32_localtime get Day^,DayOfWeek^,Hour^,Minute^,Month^,Quarter^,Second^,WeekInMonth^,Year /format:list ^| find "=" ') do (
set "__%%~a"
)
rem (kann weg) mal anzeigen, was wir da erzeugt haben
echo erzeugte Variablen: & set "__" & echo:
echo Heute ist der %date%
if %__Year% neq 2020 (
rem beenden...
echo Es gibt keinen vorgefertigten Bericht mehr
Timeout /t 20
exit /b
)
rem ich hasse endlose If-Abfragen (übergeben wir doch einfach alle Werte und machen uns wenn der richtige Monat kommt vom Acker )
for %%a in (0,31,59,90,120,151,181,212,243,273,304,334) do (
set /a "__dummyCounter+=1 , __DayOfYear=__Day+%%~a"
rem wenn der Zähler dem aktuellen Monat entsprich die Schleife verlassen
if !__dummyCounter! equ %__Month% goto :break
)
:break
rem Schaltjahr? (die 100er- und 400er-Regel außer acht lassend)
rem bei Modulo 4 sind Schaltjahre=0
set /a "__isSchaltjahr=__Year %% 4"
if %__isSchaltjahr% equ 0 (
if %__Month% gtr 2 set /a "__DayOfYear+=1"
)
rem (Sonntag = 7)
if %__DayOfWeek% equ 0 set /a "__DayOfWeek=7"
rem KW
set /a "nSd=__DayOfYear+(7-__DayOfWeek)"
set /a "KW=nSd/7"
set /a "delta=nSd-(KW*7)"
if %delta% gtr 3 set /a "KW=KW+1"
REM Ausgabe der aktuellen KW
echo Wir sind in der %KW%. Kalenderwoche
echo Heute ist der %__DayOfYear%. Tag des Jahres ^^!
REM Nummer des Berichts errechnen und richtigen Bericht öffnen
set /a Nummer=(KW+73)/2
echo Bericht: %Nummer%.docx
echo Fenster kann geschlossen werden oder wird geschlossen wenn der Bericht geschlossen wird.
echo start winword.exe "G:\DATEN\Dez1\FD102\IuK\Azubis\"Mein Name"\Berichte\2020\%Nummer%.docx"
timeout /t 20
exit /b
Bei set möglichst Angewöhnen zu "quoten" das erspart Ärger, wen eine Zuweisung Sonderzeichen enthält!
Mehrere Berechnung können einem set /a zugewiesen werden (schneller)
exit /b statt nur exit. (Exit beendet nicht nur die Batch/Subroutine, sondern auch alle übergeordneten Instanzen von cmd ). exit /b kehrt sauber zum Aufrufer zurück (wenn da einer ist)
sonst hat der alte nix zu meckern...
Wow, danke für den ausführlichen und echt hilfreichen Kommentar 👍🏽
Klar, macht sind mit der oktalen Zahl.
Vielen Dank für das verbessern meines Codes und den Erklärungen zu jeder Änderung :)
PS nur der Vollständigkeit halber:
.... bevor mir noch Jemand die Schaltjahrberechnung um die Ohren haut:
mit delayed expansion sieht es schon rech heftig aus😲