CMD Numerische Konstante Fehler?

1 Antwort

Vom Fragesteller als hilfreich ausgezeichnet
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...

Woher ich das weiß:eigene Erfahrung – Ich mach das seit 30 Jahren
Erzesel  08.05.2020, 17:44

PS nur der Vollständigkeit halber:

.... bevor mir noch Jemand die Schaltjahrberechnung um die Ohren haut:

@echo off
rem pseudocode: Jahr modulo 4 + (not (Jahr modulo 100) XOR not(Jahr modulo 400))  
:loop
set /p "Jahr= gib ne Jahreszahl ein : "
set /a "__isSchaltjahr=Jahr %% 4 + (!(Jahr %% 100) ^ !(Jahr %% 400)) "
if %__isSchaltjahr% equ 0 (
    echo %Jahr% ist ein Schaltjahr
) else (
    echo %Jahr% ist kein Schaltjahr
)
goto :loop

mit delayed expansion sieht es schon rech heftig aus😲

@echo off
setlocal enableDelayedExpansion
for /l %%a in (1985,1,2400) do ( 
    set /a "__isSchaltjahr=%%a %% 4 + (^!(%%a %% 100) ^^ ^!(%%a %% 400)) "
    if !__isSchaltjahr! equ 0 ( echo %%a ist ein Schaltjahr)
)
pause 
0
TechnikTim 
Fragesteller
 11.05.2020, 08:03
@Erzesel

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

0