Сценарий командной строки для вычитания переменных - PullRequest
0 голосов
/ 14 июля 2020

Я знаю, что здесь много арифметических c вопросов, но я не нашел конкретного c ответа на свой вопрос. У меня есть файл с двумя значениями, первое всегда выше второго. Сегодня в txt-файле есть:

21.04
20.94

То, что я пытаюсь сделать, это вычесть в пакетном файле второе число из первого, а затем вставить его в новую строку. Любая помощь приветствуется.

Ответы [ 3 ]

1 голос
/ 14 июля 2020

Просто включите powershell в пакетный файл.

для тестирования из cmd:

@for /f %i in ('powershell 21.04 - 20.94') do @echo %i

Таким образом, вы можете довольно легко построить очень простой калькулятор c.

set /p "first=Enter first number: "
set /p "second=Enter Second Number: "
set /p "function=Select Function(+-/): "
powershell %first% %function% %second%

И, конечно, вы можете использовать for l oop для присвоения значения переменной, если вы хотите использовать его в другом месте вашего командного файла.

@echo off
set /p "first=Enter first number: "
set /p "second=Enter Second Number: "
set /p "function=Select Function(+-/): "
for /f %%i in ('powershell %first% %function% %second%') do set "result=%%i"
echo %result%

в a batch-file вы удваиваете % в метапеременных до %%i

Предполагается, что файл называется math.txt

@echo off
setlocal enabledelayedexpansion
set cnt=1
for /f "usebackq" %%i in ("d:\math.txt") do (
   set var!cnt!=%%i
   set /a cnt+=1
)
(powershell %var1% - %var2%)>output.txt
pause
1 голос
/ 15 июля 2020

Этот метод работает с числами до 9 общих цифр (и с любым количеством десятичных знаков), пока входные числа имеют такое же число десятичных знаков:

@echo off
setlocal EnableDelayedExpansion

rem Read two numbers
( set /P "num1=" & set /P "num2=" ) < test.txt

rem Adjust *two* numbers for given decimals
set "decimals=2"
for %%i in (1 2) do (
   set "num%%i=!num%%i:.=!"
   for /L %%d in (1,1,%decimals%) do if "!num%%i:~0,1!" equ "0" set "num%%i=!num%%i:~1!"
)

rem Subtract second number from the first
set /A "result=num1 - num2"

rem Adjust result for given number of decimals
for /L %%d in (1,1,%decimals%) do if "!result:~%decimals%!" equ "" set "result=0!result!"

rem Output result with decimals
echo !result:~0,-%decimals%!.!result:~-%decimals%!
0 голосов
/ 14 июля 2020

Думаю, это работает для чисел разумного размера:

@echo off

rem read values from file specified as command line parameter    
(
    set /p value1=
    set /p value2=
)<%1

rem split first value into whole and fractional parts
for /f "tokens=1,2 delims=." %%a in ("%value1%") do (
    set beforedot1=%%a
    set afterdot1=%%b
)

rem reconstruct first value as fixed point number
set afterdot1=%afterdot1%00000
set afterdot1=%afterdot1:~0,6%
set value1=%beforedot1%%afterdot1%

rem split second value into whole and fractional parts
for /f "tokens=1,2 delims=." %%a in ("%value2%") do (
    set beforedot2=%%a
    set afterdot2=%%b
)

rem reconstruct second value as fixed point number
set afterdot2=%afterdot2%00000
set afterdot2=%afterdot2:~0,6%
set value2=%beforedot2%%afterdot2%

rem subtract values
set /a diff=value1-value2

rem convert fixed point value back
if "%diff:~0,-6%" == "" (
    set diff=0.%diff:~-6%
) else (
    set diff=%diff:~0,-6%.%diff:~-6%
)

rem remove trailing zeros
:loop
if "%diff:~-1%" == "0" (
    set diff=%diff:~0,-1%
    goto :loop
)

echo %diff%
...