Programmierhilfe - Rechenoperationen in BATCH?

1 Antwort

Vom Fragesteller als hilfreich ausgezeichnet

Batch ist etwas "speziell" was Variablennamen angeht.

  • VariablenNamen im Batch dürfen Leerzeichen enthalten!
  • Es ist ein Unterschied ob man schreibt x=3 oder x =3.
  • Gleiches gilt für die rechte Seite der Zuweisung x=3 ist etwas anderes als x= 3
  • Damit man nicht aus Versehen am Ende einer Variablenzuweisung ein Leerzeichen hat, sollte man immer Anführungszeichen um einen set-Term setzen!
  • Die Groß- und Kleinschreibung ist hingegen egal, außer bei Laufvariablen in For-schleifen %%a und %%A sind unterschiedliche Variablen
  • Auch wenn ich hier deine einbuchstabigen Variablennamen übernommen habe, sollten normale mit set gesetzte Variablen immer mindestens 2 Buchstaben haben (Verwechslungsgefahr mit Laufvariablen).
  • Variablen dürfen nicht mit einer Zahl beginnen. man kann sie zwar setzen, jedoch nicht darauf zugreifen. (geht schon, aber nicht für Anfänger)
  • Bei set /a dürfen sehrwohl rechts vom "=" Leerzeichen sein.
  • Man kann sogar bei set /a auf die Prozentzeichen für Variablen verzichten, da Buchstaben nur eine Variable sein können

so ist es richtig:

set "A = 99"
set "A=3"
set "B=5"
set "Zahl=55"
echo Zahl=%Zahl%, A=%A%, B=%B%
echo aber... A =(%A %) ...und  auch  noch  ein Leerzeichen  vor  der Zahl
set /a "AB =%A% + %B%"
set /a "Y= %ZAHL% %% %A%"
set /a "Z= %ZAHL% %% %B%
set /a "YZ= %ZAHL% %% %AB%"
echo AB=%ab% , Z=%Z% , YZ=%yz%
set /a "blubbb= z - yz"
echo blubbb ist %blubbb%

  rem  auch das geht:
set /a "zahl1=100 , zahl2=zahl1 * 5 , ergebniss= zahl2 / zahl1"
echo %ergebniss%
pause

https://ss64.com/nt/set.html

https://ss64.com/nt/syntax-variables.html

https://ss64.com/nt/syntax-args.html

Woher ich das weiß:eigene Erfahrung – Ich mach das seit 30 Jahren

Erzesel  18.03.2019, 21:54

PS:

Verzichte auf Bindestriche in Variablenamen, das könnte ungeahnte Folgen haben....

set "a1=333"
set "b1=66"


set "a1-b1=25
echo %a1-b1%
set /a "summe=5 + a1-b1"
echo %summe%
pause
1
Haschiii420 
Fragesteller
 19.03.2019, 18:26

hier ist das "Programm" , was ich geschrieben habe. Ich habe es bereits zum laufen gebracht, da habe ich direkt die Werte 3 und 5 hinter das %% gesetz. aber ich möchte, dass man über variablen steuern kann :D Leider funktioniert das immer noch nicht :/

@echo off

set "fizz=3"
set "buzz=5"
set /a "fizzbuzz = %fizz% * %buzz%"

set "%ZAHL% = 1"
:loop 
 set /a "Y= %ZAHL% %% %fizz"
 set /a "Z= %ZAHL% %% %buzz%
 set /a "YZ= %ZAHL% %% %fizzbuzz%"

   if /I "%fizzbuzz%" == "0" (
    echo FIZZBUZZ
     ) else (
          if /I "%fizz%" == "0" (
            echo FIZZ
     ) else (
          if /I "%buzz%" == "0" (
             echo BUZZ
     ) else (
             echo %ZAHL%
            )))

 set /a X = %ZAHL% + 1
goto loop
pause
0
Erzesel  19.03.2019, 20:23
@Haschiii420

Irgendwie macht deine Schleife keinen Sinn!

Was nutzt es wenn ich etwas erklare und Du machst die gleichen Fehler weiter?

Zwischen einem Variablennamen und = darf kein Leerzeichen sein!

set "%ZAHL% = 1" ist totaler Murks , das setzt den Variablennamen auf eine Zahl, was nicht sein darf!

%fizz% und %buzz% verändern sich nicht und werden nie Null

sie mal im debuggModus (ohne @echo off) was mit den variablen passiert :

set "fizz=3"
set "buzz=5"
set /a "fizzbuzz= %fizz% * %buzz%"
set "ZAHL=1"
:loop 
 set /a "Y= %ZAHL% %% %fizz%"
 set /a "Z= %ZAHL% %% %buzz%
 set /a "YZ= %ZAHL% %% %fizzbuzz%"
     
  rem hier  wird  nie  die eine Forderung  erfüllt, da die Variablen sich  nie verändern...
if /I "%fizzbuzz%" == "0" (
  echo FIZZBUZZ
) else (
  if /I "%fizz%" == "0" (
    echo FIZZ
  ) else (
    if /I "%buzz%" == "0" (
             echo BUZZ
    ) else (
      echo 1
    )
  )
)


rem  das X macht  keinen Sinn x wird  nie abgefragt!
set /a "X= %ZAHL% + 1"


  rem diese pause brmst  die Schleife... kann weg wenn alles klappt
pause
goto loop

so wird ein Schuh draus:

@echo off
set "fizz=3"
set "buzz=5"
set /a "fizzbuzz= %fizz% * %buzz%"

set "ZAHL=1"
:loop 
 set /a "Y= %ZAHL% %% %fizz%"
 set /a "Z= %ZAHL% %% %buzz%
 set /a "YZ= %ZAHL% %% %fizzbuzz%"
   
 rem jetzt fragen wir die zu den Operanten gehörenden Ergebnisvariablen ab und dann klap
pt es ;)
if /I "%YZ%" == "0" (echo FIZZBUZZ
) else (
 if /I "%Y%" == "0" (echo FIZZ
 ) else (
  if /I "%Z%" == "0" (echo BUZZ
  ) else (
    echo Zahl=%Zahl%
  )
 ) 
)

 rem statt des X erhöhen wir Zahl, was das einzig logische ist, wenn wir wenn Variablen durch eine Modulooperation regelmäßig 0 werden sollen 
set /a "Zahl+=1"


 rem damit das ganze  nicht durchrast...
timeout 1 >nul

goto loop

Jetzt werden die richtigen Variablen verglichen un eine Entscheidung herbeizuführen.

Keine Ahnung wo Du Deine Logik geparkt hattest :p

2
Erzesel  19.03.2019, 20:34
@Haschiii420

Ps vergiss nicht die Arbeit zu würdigen ! dafür gibt es die Daumen- , danke- und hilfreichknöpfe

2
Haschiii420 
Fragesteller
 15.04.2019, 11:56
@Erzesel

War hier länger nicht mehr online :D Ich bedanke mich definitiv für die Arbeit und den Zeitaufwand ^^ Hat jetzt alles prima geklappt :D

0