2016-07-26 25 views
1

Ich mache eine Batch-Datei, so dass ich nur sagen, welche Art von Formel ich verwenden muss und es sagt mir, welche Variablen ich eingeben muss. Im Moment kodiere ich es so, dass es die Fläche eines Dreiecks findet.Wie verwende ich grundlegende Batch-Mathe-Befehle, um mit dezimalen Antworten zu kommen?

Ich habe den Code geschrieben, so dass Sie die Basis, Höhe und die Einheiten des Dreiecks fragt. Wie Sie wissen sollten, ist die Formel einfach, Base x Höhe/2. Also habe ich den Code getestet, um zu sehen, ob es funktioniert. Aber ich habe bemerkt, dass wenn es eine ungerade Zahl durch 2 teilt, es keine Dezimalantwort gibt. Es rundet stattdessen eine Zahl ab. (Bsp. 15/2 = 7)

Hier ist mein Code:

set /p TriangleB=How long is the base of the triangle? (Don't put the unit, just put the number): 
    set /p TriangleH=What is the height of the triangle? (Don't put the unit, just put the number): 
    set /p TriangleAreaUnit=What unit is the triangle being measured in?: 
    set /a TriangleArea=%TriangleB% * %TriangleH%/2 
    echo The area of the triangle is %TriangleArea% %TriangleAreaUnit%. 
    pause >nul 
    goto :EOF 

Es macht mir keine Fehlermeldung und alles scheint glatt zu laufen, ich kann einfach nicht herausfinden, wie warum es mir keine dezimale Antwort geben wird.

+1

Stapelmathematik kann nur 32-Bit-Ganzzahlen verarbeiten. Wenn Sie Dezimalzahlen oder große Zahlen benötigen, verwenden Sie die PowerShell. – SomethingDark

Antwort

2

Sie können es so versuchen, mit einer Batch-Datei:

@echo off 
set /p "TriangleB=How long is the base of the triangle ? (Don't put the unit, just put the number): " 
set /p "TriangleH=What is the height of the triangle ? (Don't put the unit, just put the number): " 
set /p "TriangleAreaUnit=What unit is the triangle being measured in ?: " 
Call :makevbs %TriangleB% %TriangleH% 
echo The area of the triangle is %TriangleArea% %TriangleAreaUnit%^2. 
pause >nul 
Exit /b 

:makevbs 
echo wscript.echo Eval(wscript.Arguments(0^) * wscript.Arguments(1^)/2^) > "%tmp%\%~n0.vbs" 
for /f %%A in ('cscript /nologo "%tmp%\%~n0.vbs" %~1 %~2') do set TriangleArea=%%A 
exit /b 
1

verwenden eine Zeile Basic Script

Execute "Wscript.echo " & wscript.Arguments(0) 

verwenden

cscript //nologo script.vbs "2.5*2.5" 

Wie

C:\Users\User>cscript //nologo "C:\Users\User\Desktop\New Text Document.vbs" "2.5*2.5" 
6.25 

Die zweite Zeile zu verwenden ist, wie das Programm nutzen zu können, so wie ein schrieb Befehl zur Eingabeaufforderung. cscript //nologo "c:\somefolder\script.vbs" "%TriangleB% * %TriangleH%/2". Beachten Sie, dass der Ausdruck in Anführungszeichen eingeschlossen werden muss, wenn er Leerzeichen enthält. In eine Eingabeaufforderungsvariable einfügen, die für den Befehl verwendet wird. for /f "delims=" %%A in ('cscript //nologo c:\somefolder\script.vbs "%TriangleB% * %TriangleH%/2"') Do Set Result=%%A

So

C:\Users\User>Set TriangleB=5.5 

C:\Users\User>Set TriangleH=3.5 

C:\Users\User>for /f "delims=" %A in ('cscript //nologo "C:\Users\User\Desktop\New Text Document.vbs" "%TriangleB% * %TriangleH%/2"') Do Set Result=%A 

C:\Users\David Candy>Set Result=9.625 

Denken Sie daran, in einem Batch-Einsatz %%A und interaktiv (dh Typisierung) verwendet %A

die gleiche Sache in einem HTA zu tun (eine Web-Seite zu .hta umbenannt, die es macht wirken wie ein Programm)

<html> 
    <head> 
     <script language="VBScript"> 
      Sub Calculate 
       Answr.innertext = tb1.value * tb2.value /2 
      End Sub 
     </script> 
    </head> 
    <body> 

<p><INPUT Name=tb1 TYPE=Text Value="Height"> 
<p><INPUT Name=tb2 TYPE=Text Value="Width"> 
<p><INPUT NAME="Search" TYPE="BUTTON" VALUE="Calc" OnClick=Calculate> 
<div ID=Answr></div> 
</body> 
</html> 

Und in vbscript nur

Wscript.echo InputBox("Height") * Inputbox("width") /2 
+0

Also habe ich zuerst "Execute" Wscript.echo "& wscript.Arguments (0)", dann gleich danach "cscript // nologo script.vbs" 2.5 * 2.5 * "" –

+0

Als ich das versuchte, tauchte es mit auf eine Fehlermeldung, die besagt, dass diese Codes keine erkennbaren Befehle waren und immer noch den gleichen Fehler machten, keine Dezimalstellen anzuzeigen. –

+0

Nein, die erste Zeile ist ihr eigenes separates Skript, das Sie als 'script.vbs' speichern. – SomethingDark

2

Batch-Mathe kann nur 32-Bit-Ganzzahlen verarbeiten, aber es gibt Möglichkeiten, diese Einschränkung zu umgehen. Am einfachsten ist es, PowerShell zu verwenden und for /f zu nutzen, damit Sie die Ausgabe von Befehlen in Variablen speichern können.

@echo off 

set /p "TriangleB=How long is the base of the triangle? (Don't put the unit, just put the number): " 
set /p "TriangleH=What is the height of the triangle? (Don't put the unit, just put the number): " 
set /p "TriangleAreaUnit=What unit is the triangle being measured in?: " 

for /f %%A in ('powershell %TriangleB% * %TriangleH%/2') do set TriangleArea=%%A 

echo The area of the triangle is %TriangleArea% %TriangleAreaUnit%. 
pause >nul 

Solange Sie eine ältere Version von Windows als XP verwenden, wird dies funktionieren.

+0

ich gerade meine Notepad ++ Software aktualisiert, und jetzt wird das nicht funktionieren. Es hat gestern kein Problem gemacht. Jetzt gibt es mir einfach keine Antwort, und wenn ich versuche, die Batch-Datei zu beenden, weil es keine Antwort gibt, dauert es 10 Sekunden, bevor die Datei endet. Ich habe versucht, es in einen Notizblock zu legen und es dann als .bat-Datei zu speichern, und ich habe die gleichen Ergebnisse erhalten. –

+0

Texteditoren haben keinen Einfluss darauf, ob grundlegende Systemdienstprogramme wie PowerShell installiert sind oder nicht. Etwas anderes auf Ihrem System hat sich geändert, aber das ist eine Frage für SuperUser, nicht hier. – SomethingDark

0

Für die Aufgabe in der Hand Sie rund um die Begrenzung durch eine Art von Festkommaarithmetik, wie in dem followinf Beispielcode funktionieren können:

set /p TriangleB=How long is the base of the triangle? (Don't put the unit, just put the number): 
set /p TriangleH=What is the height of the triangle? (Don't put the unit, just put the number): 
set /p TriangleAreaUnit=What unit is the triangle being measured in?: 
set /a TriangleArea=%TriangleB% * %TriangleH% * 10/2 
echo The area of the triangle is %TriangleArea:~,-1%.%TriangleArea:~-1% %TriangleAreaUnit%. 
pause >nul 
goto :EOF 

Was ich hier mache, ist nichts anderes, als alles mit 10 zu multiplizieren, so dass die Division durch 2 nicht mehr einen Bruchteil erzeugt, der verloren wäre; Danach wird das Dezimaltrennzeichen durch Zeichenfolgenmanipulationsoperationen eingefügt.
Dies funktioniert nur, wenn die eingegebenen Zahlen Ganzzahlen sind. Natürlich können Sie das auf mehr Dezimalzahlen erweitern; Sie müssen jedoch berücksichtigen, dass das Zwischenergebnis die 32-Bit-Vorzeichenbeschränkung nicht überschreitet.