19.04.2020

Einleitung

Das Rechnen mit Kommazahlen ist weder in der CMD noch Batch vorgesehen. Werte werden automatisch gerundet oder es kommt zu Fehlermeldungen.
Das ist ärgerlich und als Krücke lohnt es sich hier über den Tellerrand hinauszusehen und kurzweilig auf eine andere Programmiersprache zurückzugreifen.

Egal ob sie jetzt die beiden geläufigen Windowssprachen VB-Script oder Powershell ausweichen, die Tücke liegt wieder im Detail: Beide Programmiersprachen erwarten in englischer Manier grundsätzlich einen Punkt statt ein Komma.

Grundsätzlich beinhaltet wieder bei VB-Script wieder eine nette Ausnahme: Gibt man einen Kommawert in ein Inputfeld ein, so kann man mit diesem Wert weiterrechnen.

Grau ist bekanntlich alle Theorie, also hier einmal ein kleines VB-Script, dass Sie als Basis für spätere eigene Scripts abändern können.

irgendeinName.vbs
Dim Prozentsatz
Prozentsatz=InputBox ("Tragen sie den Prozentsatz mit einer Kommazahl ein!!!")
Dim Grundwert
Grundwert=InputBox ("Tragen sie den Grundwert  ein!!!")
Prozentwert = (Grundwert*Prozentsatz)/100
ergebnis = Prozentwert
ZielDatei = "prozentwert.txt"
CreateObject("Scripting.FileSystemObject").CreateTextFile(ZielDatei, True).WriteLine ergebnis


Es wird eine Variable namens Prozentsatz eingeführt (
Dim Prozentsatz). Weil es hier als Ausnahme möglich ist kreieren wir eine Inputbox mit Beschriftung ein, deren Value (Eingabewert) der variablen Prozentsatz entspricht (Prozentsatz=InputBox ("Tragen sie den Prozentsatz mit einer Kommazahl ein!!!")).

Dasselbe machen wir mit der Variablen Grundwert in den nächsten zwei Zeilen. Das VB-Script hat nun den Grundwert und Prozentsatz parat und damit kann man bekanntlich den Prozentwert errechnen.

Ja, richtig, man könnte jetzt noch eine Zeile Dim Prozentwert schreiben, aber ich spare mir das und definiere gleich Prozentwert mit der guten alten Prozentwertformel
Prozentwert = (Grundwert*Prozentsatz)/100

Ja, Punkt geht vor Strichrechnung, ich setze trotzdem Klammern. Danach setze ich eine neue Variable Namens ergebnis gleich dem Prozentwert. In dieser steht das Ergebnis.

Danach definiere ich eine variable Namens Zieldatei die einem noch nicht vorhandenen Dokument prozentwert.txt entspricht (
ZielDatei = "prozentwert.txt"). Diese Zeile ist in Zusammenhang mit der nächsten Zeile zu sehen. Dort wird  das TextDokument kreiert und das Ergebnis eingetragen.
CreateObject("Scripting.FileSystemObject").CreateTextFile(ZielDatei, True).WriteLine ergebnis

Die orangen und variablen in den letzten zwei Zeilen sind veränderbar, der Rest ist Syntax zur Erschaffung eines Textdokumentes.

Das ganze Destruktiv, also sollte irgendein Textdokument mit demselben Namen vorhanden sein, so wird es überschrieben. Versuchen Sie nun einmal das Skript: Sie haben gerade einen krummen Prozentert erstellt und dieser wird in einem Textdokument ausgegeben.

Ich behaupte, dass sie mit dieser Vorlage nun alle +, -,+ und geteilt-Operationen können-:)

Vielleicht noch einmal die Schritte in allgemeiner Form zusammengefasst:

1. Textdokument erstellen
2. Eine mathematische Formel erstellen (Rechnung
= 1.333+1.44)
(Sie erinnern sich, normalerweise benutzen sie . statt, ansonsten gibt es eine Fehlermeldung)
3. Das Ergebnis in eine neue Variable bringen (ergebnis=Rechnung)
4. Namen für ein Textdokument erstellen  (
ZielDatei = "irgendeinname.txt")
5. Das Ergebnis in das neue Textdokument mit irgendeinname.txt schreiben (
CreateObject("Scripting.FileSystemObject").CreateTextFile(ZielDatei, True).WriteLine ergebnis)

6. Das Script sieht im Beispiel dann so aus:

Dim Rechnung
Rechnung=1.333 + 1.44
ergebnis=Rechnung
ZielDatei = "irgendeinname.txt"
CreateObject("Scripting.FileSystemObject").CreateTextFile(ZielDatei, True).WriteLine ergebnis

7. Das Textdokument mit der o. a. Formel unter irgendeinname.vbs abspeichern
8. Doppelklick zum Start

Für Menschen im VB-Script ist diese Abhandlung hier abgeschlossen Punkt statt Komma und es kommt ein brauchbares Ergebnis mit Komma bei der Herausgabe.

Für Batchschreiber jetzt einmal ein kalter Sprung ins Wasser: Mit der folgenden Batch rechnen wir den Prozentwert von der deutschen Bevölkerung bei eigegebenen Prozentsatz aus: VB-Script liefert uns dabei ein Eingabefeld und die Berechnung. Der Austausch geschieht über Textdokumente:

irgendeinname.batch

set destination=%~dp0%
>"%destination%frage.vbs"  ECHO ZielDatei = "Prozentsatz.txt"
 >>"%destination%frage.vbs"  ECHO username=InputBox ("Geben sie die die Prozentsatzzahl der deutschen Population ein")
 >>"%destination%frage.vbs"  ECHO CreateObject("Scripting.FileSystemObject").CreateTextFile(ZielDatei, True).WriteLine username
 start /wait frage.vbs
set /p Prozent1=<Prozentsatz.txt
set prozentzahl=%Prozent1%
echo %prozentzahl:,=.% >zwischenprozent.txt
set /p prozente=<zwischenprozent.txt
>"%destination%rechnen1.vbs"  ECHO ZielDatei = "prozentwert.txt"
>>"%destination%rechnen1.vbs" Echo Prozentwert = (83000000*%prozente%)/100
>>"%destination%rechnen1.vbs" Echo ergebnis = Prozentwert
>>"%destination%rechnen1.vbs"  ECHO CreateObject("Scripting.FileSystemObject").CreateTextFile(ZielDatei, True).WriteLine ergebnis
start /wait rechnen1.vbs

Wenn Sie die Batch starten passiert folgendes:

set destination=%~dp0%
Die Lage der Batch wird ermittelt und das Ergebnis in die Variable %destination% geschrieben. Die cmd befindet sich nun im selben Ordner wie die Batch.

>"%destination%frage.vbs"  ECHO ZielDatei = "Prozentsatz.txt" Wir Schreiben die erste Zeile eines VB.Scriptes Namens frage.vbs. Hineingeschrieben (Echo) wird die erste Zeile (>):   ZielDatei = "Prozentsatz.txt"

 >>"%destination%frage.vbs"  ECHO username=InputBox ("Geben sie die die Prozentsatzzahl der deutschen Population ein")

Die zweite Zeile wird nicht distruktiv, also ergänzend (
>>) geschrieben (Echo).

>>"%destination%frage.vbs"  ECHO CreateObject("Scripting.FileSystemObject").CreateTextFile(ZielDatei, True).WriteLine username

Die dritte Zeile wird geschrieben und damit haben wir ein vollständiges frage.VB-Script geschrieben

ZielDatei = "Prozentsatz.txt"
username=InputBox ("Geben sie die die Prozentsatzzahl der deutschen Population ein")
 CreateObject("Scripting.FileSystemObject").CreateTextFile(ZielDatei, True).WriteLine username

Dieses erstellte frage.vbs starten wir in der nächsten Zeile der Batch:
start /wait frage.vbs

Durch den Parameter Waite wartet die cmd auf die Ausführung des VB-Scriptes.

Eine Fragebox erscheint und Sie geben jetzt z. B. 2,5 ein (ohne Prozentzeichen!!!). Diese 2,5 wird in das Dokument Prozentsatz.txt geschrieben.

set /p Prozent1=<Prozentsatz.txt
set prozentzahl=%Prozent1%
echo %prozentzahl:,=.% >zwischenprozent.txt


Im nächsten Schritt wird die 2,5 aus dem Prozentsatz.txt als Variable Prozent1 übernommen (
set /p Prozent1=<Prozentsatz.txt).

Als nächstes ersetzen wir das Komma aus der Variable (im Beispiel 2,5 ) durch einen Punkt:
set prozentzahl=%Prozent1%
Wir schaffen dazu die Variable Prozentzahl und setzen sie mit %Prozent1%   gleich. Dann geben wir ein Echo der Prozenzahl mit . statt , aus und schreiben die Zahl in ein Zwischendokument.txt  (echo %prozentzahl:,=.% >zwischenprozent.txt) .

Da steht nun 2Punkt5 statt 2Komma5 drin. Ziel erreicht.

set /p prozente=<zwischenprozent.txt
Wir laden die 2.5 nun wieder als Variable. Ich mache das jetzt extra mit Zwischenschritten in Textdokumenten, damit man den Überblick nicht verliert und zur Not Fehler erkennt. Machen Sie das auch so - Zwischendokumente kann man mit del am Ende zerstören....

>"%destination%rechnen1.vbs"  ECHO ZielDatei = "prozentwert.txt"
>>"%destination%rechnen1.vbs" Echo Prozentwert = (83000000*%prozente%)/100
>>"%destination%rechnen1.vbs" Echo ergebnis = Prozentwert
>>"%destination%rechnen1.vbs"  ECHO CreateObject("Scripting.FileSystemObject").CreateTextFile(ZielDatei, True).WriteLine ergebnis
start /wait rechnen1.vbs


Jetzt wird das rechnen.vbs erstellt und das geht genauso wie das frage.vbs. Vier Zeilen werden in das Dokument geschrieben (>>). Hinter dem Echo steht der Text des VB-Scriptes (rechnen1.vbs). Mit start /wait wird das rechnen1vb-Script gestartet und dann steht im Prozentwert.txt das Ergebnis.

rechnen1.vbs
ZielDatei = "prozentwert.txt"
Prozentwert = (83000000*2.5)/100
ergebnis = Prozentwert
CreateObject("Scripting.FileSystemObject").CreateTextFile(ZielDatei, True).WriteLine ergebnis

Nur die zweite Zeile ist erklärungsbedürftig, ich habe in unserem Beispiel eine 2,5 verwendet....

>>"%destination%rechnen1.vbs" Echo Prozentwert = (83000000*%prozente%)/100

Hier ist die eigentliche Prozentwertrechnung:
(83000000*%prozente%)/100
83.000.000 ist die Einwohnerzahl der Bundesrepublik Deutschland. Die Einwohnerzahl mal die Variable %Prozente% (zwei Prozentzeichen bei einer Batch) ist die Variable der Batch, die dafür die 2.5 aus dem Zwischen.txt verwendet (set /p prozente=<zwischenprozent.txt ).

Das ganze drurch hundert. Danach würde ich alle unsinnigen Dokument und das frage.vbs und rechnen1.vbs löschen, also  die batch so schreiben:

 
irgendeinname.batch

set destination=%~dp0%
>"%destination%frage.vbs"  ECHO ZielDatei = "Prozentsatz.txt"
 >>"%destination%frage.vbs"  ECHO username=InputBox ("Geben sie die die Prozentsatzzahl der deutschen Population ein")
 >>"%destination%frage.vbs"  ECHO CreateObject("Scripting.FileSystemObject").CreateTextFile(ZielDatei, True).WriteLine username
 start /wait frage.vbs
set /p Prozent1=<Prozentsatz.txt
set prozentzahl=%Prozent1%
echo %prozentzahl:,=.% >zwischenprozent.txt
set /p prozente=<zwischenprozent.txt
>"%destination%rechnen1.vbs"  ECHO ZielDatei = "prozentwert.txt"
>>"%destination%rechnen1.vbs" Echo Prozentwert = (83000000*%prozente%)/100
>>"%destination%rechnen1.vbs" Echo ergebnis = Prozentwert
>>"%destination%rechnen1.vbs"  ECHO CreateObject("Scripting.FileSystemObject").CreateTextFile(ZielDatei, True).WriteLine ergebnis
start /wait rechnen1.vbs

del Prozentsatz.txt
del zwischenprozent.txt
del frage.vbs
del rechnen1.vbs

Das sieht erst einmal kompliziert aus, sind aber unter 20 Zeilen Code für ein schönes Eingabefeld, eine ganze Prozentberechnung und die Ausgabe in ein Textdokument.

Der Aufwand lohnt sich und der Autor machte daraus eine Batch zur Entwicklung der Herdenimmunität, die dann mehrere Berechnungen nach dem gleichen Schema macht.

Mal einfach ausprobieren: Die Eingaben sind definitiv ohne Komma, aber eben nicht die Ausgaben...

irgendeinname.bat

if exist statistik.txt del statistik.txt
set destination=%~dp0%
>"%destination%frage.vbs"  ECHO ZielDatei = "row.txt"
 >>"%destination%frage.vbs"  ECHO username=InputBox ("Tragen sie den R0-Wert als ganze Zahl ueber 1 ein, also 2,3,4 oder 5!")
 >>"%destination%frage.vbs"  ECHO CreateObject("Scripting.FileSystemObject").CreateTextFile(ZielDatei, True).WriteLine username
 start /wait frage.vbs
>"%destination%frage1.vbs"  ECHO ZielDatei = "bev.txt"
 >>"%destination%frage1.vbs"  ECHO username=InputBox ("Geben sie die Zahl der Population ohne komma ein, 100 bis 10.000 als Vorschlag")
 >>"%destination%frage1.vbs"  ECHO CreateObject("Scripting.FileSystemObject").CreateTextFile(ZielDatei, True).WriteLine username
 start /wait frage1.vbs
>"%destination%frage2.vbs"  ECHO ZielDatei = "tage.txt"
 >>"%destination%frage2.vbs"  ECHO username=InputBox ("Geben sie die Tage der Infektion ohne komma ein. Daraus wird die durchschnittliche Infektion pro Tag errechnet")
 >>"%destination%frage2.vbs"  ECHO CreateObject("Scripting.FileSystemObject").CreateTextFile(ZielDatei, True).WriteLine username
 start /wait frage2.vbs

>"%destination%frage4.vbs"  ECHO ZielDatei = "death.txt"
 >>"%destination%frage4.vbs"  ECHO username=InputBox ("Geben sie die Prozentzahl der Mortalitaet ohne Prozentzeichen, aber mit Komma moeglich, ein. Also 0,25 ist OK")
 >>"%destination%frage4.vbs"  ECHO CreateObject("Scripting.FileSystemObject").CreateTextFile(ZielDatei, True).WriteLine username
 start /wait frage4.vbs
set /p tag=<tage.txt
set /p neuinfekt=<row.txt
set /p bevzahl=<bev.txt
del frage.vbs
del row.txt
del tage.txt
del frage1.vbs
del bev.txt
set /a durchlauf=0
set /a constantinfekt=%neuinfekt%
:Neuinfektionen
set /a durchlauf=%durchlauf% + 1
set /a neuinfekt=%neuinfekt% - 1
if %neuinfekt% equ 0 goto aus
SET MIN=1
  SET MAX=%bevzahl%
  SET /a zzahl=MIN+(MAX-MIN+1)*%random%/32768

if exist infizierter_%zzahl%.txt Echo fehl>>statistik.txt
if not exist infizierter_%zzahl%.txt Echo infektion>>statistik.txt

if exist infizierter_%zzahl%.txt goto Neuinfektionen
if not exist infizierter_%zzahl%.txt echo 1 >infizierter_%zzahl%.txt
set /a neuinfekt=%neuinfekt% + %constantinfekt%
goto Neuinfektionen
:aus
for /f "TOKENS=*" %%a in ('dir infizierter_*.txt /b') do type "%%a" >>ergebnis.txt
FOR /F "delims=:" %%A IN ('findstr /N .* "ergebnis.txt"') DO echo %%A >>endergebnis.txt
del infizierter_*.txt
del ergebnis.txt

FOR /F "delims=:" %%A IN ('findstr /N .* "statistik.txt"') DO echo %%A >zeilen.txt
set /p infor=<zeilen.txt
>>"%destination%statistik.txt" Echo Im Text sind %infor% Zeilen!
del zeilen.txt

@echo off & setlocal
set "LetzteZeile="
for /f "tokens=1* delims=:" %%i in ('findstr /n "^" "endergebnis.txt"') do set "LetzteZeile=%%j"
echo\%LetzteZeile% >>ergebnis.txt
del endergebnis.txt

set /p endwert=<ergebnis.txt
>"%destination%rechnen.vbs"  ECHO ZielDatei = "Prozentsatz.txt"
>>"%destination%rechnen.vbs" Echo Prozentsatz = (%endwert%/%bevzahl%)*100
>>"%destination%rechnen.vbs" Echo ergebnis = Prozentsatz
>>"%destination%rechnen.vbs"  ECHO CreateObject("Scripting.FileSystemObject").CreateTextFile(ZielDatei, True).WriteLine ergebnis
start /wait rechnen.vbs
del rechnen.vbs
set /p Prozent=<Prozentsatz.txt
set /p Prozent1=<Prozentsatz.txt
set prozentzahl=%Prozent1%
echo %prozentzahl:,=.% >zwischenprozent.txt
set /p prozente=<zwischenprozent.txt
>"%destination%rechnen1.vbs"  ECHO ZielDatei = "prozentwert.txt"
>>"%destination%rechnen1.vbs" Echo Prozentwert = (83000000*%prozente%)/100
>>"%destination%rechnen1.vbs" Echo ergebnis1 = Prozentwert
>>"%destination%rechnen1.vbs"  ECHO CreateObject("Scripting.FileSystemObject").CreateTextFile(ZielDatei, True).WriteLine ergebnis1
start /wait rechnen1.vbs
set /p prozentwert=<prozentwert.txt
set prozwert=%prozentwert%
echo %prozwert:,=.% >zwischenprozwert.txt
set /p prowert=<zwischenprozwert.txt


>"%destination%rechnen2.vbs"  ECHO ZielDatei = "tagwert.txt"
>>"%destination%rechnen2.vbs" Echo tagwert = %prowert%/%tag%
>>"%destination%rechnen2.vbs" Echo ergebnis2 = tagwert
>>"%destination%rechnen2.vbs"  ECHO CreateObject("Scripting.FileSystemObject").CreateTextFile(ZielDatei, True).WriteLine ergebnis2
start /wait rechnen2.vbs

set /p deathpro=<death.txt
set sterberate=%deathpro%
echo %sterberate:,=.% >sterbprozent.txt
set /p stirbprozent=<sterbprozent.txt

>"%destination%rechnen4.vbs"  ECHO ZielDatei = "prozenttot.txt"
>>"%destination%rechnen4.vbs" Echo Prozentwert = (%prowert%*%stirbprozent%)/100
>>"%destination%rechnen4.vbs" Echo ergebnis4 = Prozentwert
>>"%destination%rechnen4.vbs"  ECHO CreateObject("Scripting.FileSystemObject").CreateTextFile(ZielDatei, True).WriteLine ergebnis4
start /wait rechnen4.vbs
set /p prozentwtod=<prozenttot.txt


set /p tageswert=<tagwert.txt
set /p inf=<ergebnis.txt
if not exist resultat.txt echo Ergebnis >resultat.txt
>>"%destination%resultat.txt"  ECHO Bei einer Gesamtpopulation von %bevzahl%  wurden %inf% infiziert.
>>"%destination%resultat.txt" ECHO Dieses entspricht %Prozent% Prozent!!
>>"%destination%resultat.txt" ECHO Es gab %infor% Ansteckungsversuche insgesamt.
>>"%destination%resultat.txt" Echo Bei einer Bevölkerung von 83.000.000 entspricht dieses %prozentwert% Menschen.
>>"%destination%resultat.txt" Echo Davon würden bei %deathpro% Prozent %prozentwtod% Menschen sterben.
>>"%destination%resultat.txt" Echo In %tag% Tagen wuerden pro Tag durchschnittlich %tageswert% Menschen infiziert werden!!!
>>"%destination%resultat.txt" ECHO Ende 
del Prozentsatz.txt
del ergebnis.txt
del frage2.vbs
del prozentwert.txt
del rechnen1.vbs
del rechnen2.vbs
del tagwert.txt
del zwischenprozent.txt
del zwischenprozwert.txt
del rechnen4.vbs
del prozenttot.txt
del death.txt
del frage4.vbs
del sterbprozent.txt










 


ee

Impressum
Datenschutz