Benötige Batch File, dass 80% zu einer txt Dabei mit Nummern addiert?

2 Antworten

Dabei kommt es darauf an, ob es sich bei den Zahlen um ganze Zahlen (Interger) oder oder Kommazahlen handelt.

Batch kann nicht wirklich gut rechnen. (was es kann genügt gerade um Dateien zu Zählen )

Dabei beschränkt sich der verarbeitbare Zahlenraum auf Integer (-2147483648..2147483647), mit Komma kann Batch selbst nicht umgehen.

aber man kann tricksen...

nummern.txt

12345
10
156211
10000
48231
100
20
1.7
10.001
@echo off
setlocal enableDelayedExpansion
  rem result.txt leeren...
(@call)>"result.txt"
  rem zahl aus Datei einlesen...
for /f "usebackq tokens=*" %%a in ("nummern.txt") do (
      rem Prozentrechnung wäre Zahl /100 *80 , in Deinem Fall
      rem alle Prozentergebnisse von Zahlen unter 100 würden  automatisch 0 sein! Batch kennt kein  Komma
      rem also auf schmutzige Batchart *100 durch anhängen von zwei 0en , Berechnen... und  wieder /100
      rem  damit ist die  größte verarbeitbare Zahl  21474836
      rem rundet allerdings immer ab!
    set /a "proz_80=%%a00/100*80 , res=%%a + proz_80 /100"
    echo !res! >>"result.txt"
)
type "result.txt"
pause

mit den letzten beiden floatingpoint-Zahlen kann Set /a nichts Anfangen! als gibts ne Fehlemeldung. (das könnte man Fixen, aber das wäre einfach Blödsinn...Batch ist kein Rechner)

egal... zur vollständigkeit wenigsten auch noch Kommaergebnisse in purem Batch (just for Fun)

...aber das hat schon fast nichts mehr mit rechnen zu tun.

@echo off
setlocal enableDelayedExpansion
  rem result.txt leeren...
(@call)>"resultBatchKomma.txt"
  rem zahl aus Datei einlesen...
for /f "usebackq tokens=*" %%a in ("nummern.txt") do (
    set /a "proz_80=%%a00/100*80 , res=%%a0 + proz_80 /10"
      rem Kommazauber in Batch --- Stringzerlegung  für eine Nachkommastelle
      rem String außer letzte 1 Zeichen  Komma letzte 1 Zeichen
    echo !res:~0,-1!,!res:~-1!>>resultBatchKomma.txt"
)
type "resultBatchKomma.txt"

Man kann natürlich auch ein kleines "Programm" in Javascript schreiben, das jegliche Berechnung ausführt....

calc.js

var t='';
for (var i = 0; i < WScript.Arguments.Length;i++) {
    t=t+WScript.Arguments(i)
};
WSH.Echo(eval(t))

...und das erzeugen der des Programms erledigt die Batch bei Bedarf selbst...

Und delegiert die Rechnerei....

@echo off
(@call)>"result.js.txt"
  rem  kleines Javasript erzeugen das  jeden! übergebenen String als funktion ansieht und  deren Egebniss zurückgibt
if not exist "%Temp%\calc.js"  echo var t='';for (var i = 0; i ^< WScript.Arguments.Length;i++){t=t+WScript.Arguments(i)}; WSH.Echo( eval(t) ) >"%Temp%\calc.js"

  rem Aufruf....  Beispiel:
cscript /nologo "%Temp%\calc.js" 103+ 103/100*80

echo Berechne Werte aus datei...
  rem nun das ganze mit der Datei
for /f "usebackq tokens=*" %%a in ("nummern.txt") do (
      rem Ergebnis gleich in eine Datei schreiben (eventuelle Klammern in der Formel maskieren  % für modulo verdoppeln !)
    cscript /nologo "%Temp%\calc.js" %%a + %%a/100*80 >>"result.js.txt"
)
type "result.js.txt"
pause

das sieht komplizierter aus als es ist....

hier noch mit echter kaufmännischer Rundung:

(@call)>"result.jsRound.txt"
if not exist "%Temp%\calc.js"  echo var t='';for (var i = 0; i ^< WScript.Arguments.Length;i++){t=t+WScript.Arguments(i)}; WSH.Echo( eval(t) ) >"%Temp%\calc.js"
echo gerundet Beispiel...
  rem Wichtig  Math.round darf nur so gescrieben werden (gilt auch  für andere Funktionen von JScript's Math! https://developer.mozilla.org/de/docs/Web/JavaScript/Reference/Global_Objects/Math) 
  cscript /nologo "%Temp%\calc.js" Math.round(103+ 103/100*80)


echo Berechne Werte aus datei...
for /f "usebackq tokens=*" %%a in ("nummern.txt") do (
      rem Ergebnis gleich in eine Datei schreiben (eventuelle Klammern in der Formel maskieren  % für modulo verdoppeln !)
    cscript /nologo "%Temp%\calc.js" Math.round^(%%a + %%a/100*80^) >>"result.jsRound.txt"
)
type "result.jsRound.txt"
pause

Fazit wer versucht in Batch Berechnungen anzustellen hat die falsche Sprache für sein Projekt gewählt.

Es gibt zig Sprachen, die dein Vorhaben aus einem Stück erledigen könnten.

Warum nicht gleich die Datei in JS, Powershell, VBScript oder What ever auslesen , die Berechnung machen lassen uns schreiben?

Natürlich macht Sprachen mixen mir Spaß, aber das ist nur der schmutzige Weg...

klendather 
Fragesteller
 15.10.2019, 01:35

Hey Danke! Habe die Batch Datei ausprobiert (erstere) und sie funktioniert, produziert aber auch den Fehler, den du genannt hast. Du meinstest, man kann das fixen... Wäre das sehr aufwendig? Mir würde das schon ein gutes Stück weiter helfen :-) Lg und vielen Dank schon mal bis hier hin! Klen

0
Erzesel  15.10.2019, 09:20
@klendather

Das "fixen" bezog sich auf eine rein theoretische Erwägung.

Das es möglich ist bedeutet nicht zwangsläufig, das es Sinnvoll ist...

Der Aufwand Batch die Kommarechnung beizubringen steht in keinen Verhältnis zum Nutzen. Allein der Aufwand um festzustellen ob es sich um eine Kommazahl handelt und wieviel Stellen diese hinter dem Komma hat, wäre eine Aufgabe für lange Winterabende.

Wenn ich erstmal mit derartigem Quatsch anfange , habe ich am Ende ein BatchMonster mit +100 Zeilen die nichts weiter tun als mein kleines Einzeiliges Javascript , aber sehr viel langsamer.

Ich habe nicht umsonst die Variante mit dem kleinen Kommandozeilen-Taschenrechner geschrieben...

Was gefällt dir an letzeren Varianten nicht?

Zum thema aus einem Guss:

In Powershell ist die ganze Sache mit einer kleinen Zeile zu erledigen

Demo.ps1

gc nummern.txt|%{[double]$_+[double]$_/100*80}|tee result.txt

...aus der Console ,einer Batch oder sogar aus einem Shortcut aufgerufen:

powershell -c "&{gc nummern.txt|%{[double]$_+[double]$_/100*80}|tee result.txt}"

Alle Wege führen nach Rom, warum sollte man dann 100 Zeilen Batch produzieren? ..außer man ist mächtig gelangweilt.

Ich empfehle Dir einfach die geeigneten Mittel auszuwählen um ein Problem zu lösen.

Die von mir verwendeten Mittel sind auf jedem Windows-System ab..Win 7 (teilweise sogar ab Win 2000/NT) stets verfügbar, es muss nie etwas von 3.Anbietern installiert werden...

1
Ich habe es bisher mit verschiedenen anderen Funktionen geschafft, weiß aber nicht, wie es mit Prozentrechnung funktioniert.

Ganz einfach: um 80% hinzu zu addieren multipliziert du die Zahl mit 1,8

Erzesel  14.10.2019, 10:46
multipliziert du die Zahl mit 1,8

schön , wenn jemand versucht zu helfen, aber dann sollte man die Sprache auch beherrschen. Batch kann nur mit ganzen Zahlen rechnen....

0