Kann man mit CMD rechnen?

1 Antwort

Von Experte daCypher bestätigt

Rechnen mit Batch ist in der Regel keine Vergnügen.

Batch kann (ohne Hilfsmittel) nur mit ganzen Zahlen von -2147483648 bis 2147483647 rechnen. sowohl Eingaben, wie auch Ergebnisse müssen in diesem Bereich liegen, sonst gibt es Fehlermeldungen.

demo1.cmd

@echo off
set /a "result= 25*6"
echo  %result%
set /a "result+= 7"
echo  %result%
set /a "result/=100"
echo  %result% das kann nint stimmen!
pause

Hat man große Zahlen oder benötigt man genaue Ergebnisse muss man mit Hilfsprogrammen arbeiten , welche diesen Einschränkungen nicht unterliegen:

simpleCalcJS.cmd

@echo off
  rem JavaScript Hilfsprogramm schreiben
if not exist "%temp%\calc.js"  echo var Formel='';for (var i = 0; i ^< WScript.Arguments.Length;i++){Formel=Formel+WScript.Arguments(i)};WScript.Echo(eval(Formel))   >"%temp%\calc.js"
  rem Macro für  den Aufruf  des Javascript definieren
set m_calc= cscript /nologo "%temp%\calc.js"

rem testaufruf (einfach zur Demo)
%m_calc% (5.666+222)/77

set "Radius=22"
echo der Radius   eines Kreises sei:22
  rem  Ergebniss eienr Variable zuweisen 
for /f "tokens=1* delims=," %%a in ('%m_calc% 2 * Math.PI * %radius%') do (
    if "%%b"=="" (set "__result=%%a"
    ) else (set "__result=%%a,%%b")
)
echo Der Umfang ist: %__result%

echo:
set "Formel=1/3/3/2*4"
for /f "tokens=1* delims=," %%a in ('%m_calc% %Formel%') do (
    if "%%b"=="" (set "__result=%%a"
    ) else (set "__result=%%a,%%b")
)
echo  %Formel% = %__result%

pause
exit /b

Damit lernst Du auch die fiese Fratze von Batch kennen, den Commandloop. Dieser ist die einzige Möglichkeit die Ergebnisse anderer Kommandozeilenprogramme an Batchvariablen zu übergeben.

Wenn ich Dir einen guten Rat geben kann, vergiss das altbackene komplizierte Batch und geh mit der Zeit. Powershell ist die (nicht mehr ganz) neu Scriptsprache von Windows. Es kann alles was Batch auch kann nur viel besser. Zudem ist es ebenso mächtig wie C# (nur das man keinen Compiler benötigt).

primzahlen.ps1

using namespace System.Collections.Generic
#variante des Sieb des Eratosthenes ...
# #1 bis 3 sind ohnehin Primzahlen  
1..3 | %{Write-Host " $_ Primzahl"}
[List[int]]$PrimeList = 3
$stopwatch = [system.diagnostics.stopwatch]::StartNew()
for ($i=$PrimeList[0]+2 ; $i -le 1000000; $i+=2){
  $BreakNum=[Math]::Sqrt($i) 
  foreach ( $prim in $PrimeList ) {
    if ( $prim -gt $BreakNum ) {
      $i
      $Null=$PrimeList.Add($i)
      break
    }
    if ( !($i % $prim) ) {
      break
    }
  }
}
$stopwatch.Stop()
'{0:g} fuer {1} Primzahlen'-f $stopwatch.Elapsed,$PrimeList.count
pause
Woher ich das weiß:eigene Erfahrung – Ich mach das seit 30 Jahren