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