批处理脚本,用于从变量中减去正确的数字

batch script to subtract correct digits from variables

提问人:Chad 提问时间:7/5/2023 更新时间:7/5/2023 访问量:75

问:

我试图弄清楚如何根据带有句点 (. ) 的数字从变量中减去正确的信息(我需要)。我知道如何告诉批处理脚本给我一定数量的数字,但如果总数更多(或更少),它就不会给我我需要的信息, 示例

在某些答案上,我当前的脚本会给我 4.129,这是我需要的(句点之前的数字,然后是之后的 3 位数字,但是当句点之前的数字是 2 位或更多时,我得到这个 41.29 并且没有我需要的解决方案的第三位数字。

@echo off

set "File2Read=amts.txt"
If Not Exist "%File2Read%" (Goto :Error)

set count=0
set count2=0

rem This will read a file into an array of variables and populate it 

setlocal EnableExtensions EnableDelayedExpansion

FOR /F "tokens=*" %%I IN (%File2Read%) do (
  set /a count=count+1
  set amt[!count!]=%%~nI
)

:TList

:: Print list of files

for /l %%I in (1,1,!count!) do (
   echo %%I] !amt[%%I]!
)
echo.

pause

sqlcmd -S .\Paterson -U sa -P pcAmer1ca -d Website -Q "SET NOCOUNT ON select Price from Inventory WHERE ItemNum = '57'" -h-1 -W > tmp.txt

set /P myVar= < tmp.txt

echo %myVar%

set cost=%myVar:~0,5%

echo %cost%

pause

echo !amt[3]!

for /F "delims=" %%i in ('powershell (!amt[3]! / %cost%^)') do set gal=%%i

set sell=%gal:~0,5%

echo Gallons: %sell%          

pause

Exit

::***************************************************
:Error
cls & Color 4C
echo(
echo   The file "%File2Read%" dos not exist !
Pause>nul
exit /b
::***************************************************

我无法弄清楚如何获得我正在寻找的结果,任何帮助将不胜感激

有关我尝试过的内容,请参阅上面的代码

使用当前代码,我得到了上述结果

sql-server 变量 批处理文件

评论

0赞 Tim Roberts 7/5/2023
Batch 只是此任务的错误语言。您需要一种脚本语言,如 Python 或 Powershell,您可以在其中进行真正的字符串操作和格式设置。
0赞 Chad 7/5/2023
我明白这一点,但由于我工作的环境和我正在使用的系统,我需要它采用 .bat 格式(可以嵌入 powershell / 等)?有什么方法可以得到我正在寻找的结果吗?我已经看到了做类似事情的方法,但我只学习了大约 4 个月的批处理脚本
0赞 siggemannen 7/5/2023
你知道你可以把从sql得到的字符串格式化为你需要的任何内容吗?你到底在寻找什么吗?小数点后 3 位的数字?
1赞 SomethingDark 7/5/2023
@TimRoberts - 批处理是一种具有字符串操作能力的脚本语言;我很想知道你对这种语言的分类是什么。
0赞 Tim Roberts 7/5/2023
它几乎不算是一种语言。它最初只不过是一种收集命令的方式,随着时间的推移,Microsoft 一直专注于黑客,以允许一些最小的变量操作。它会扭曲你的大脑。

答:

0赞 Stephan 7/5/2023 #1

假设 u 包含一个浮点数 (),您可以将其分解为点前部分和点后部分,在第二部分添加一些零并将其缩短为三个字符并重新组合(以确保点后始终有三个数字)。tmp.txt<one-or-more-digits><dot><one-or-more-digits>

我把这个反汇编和汇编到一个子程序中,以保持主代码的整洁。

@echo off & setlocal

call :format "0.1" var 
echo %var%
call :format "1.234" var
echo %var%
call :format "2.23456" var
echo %var%
call :format "345.6789" var
echo %var% 
goto :of

:format
for /f "tokens=1,2 delims=." %%a in ("%~1") do (
  set "post=%%b000"
  set "%2=%%a.!post:~0,3!"
)
goto :eof

输出:

0.100
1.234
2.234
345.678

评论

0赞 Chad 7/5/2023
这应该有效,但我正在寻找修复名为%sell%的代码部分中的变量(结果)...echo !amt[3]!for /F “delims=” %%i in ('powershell (!amt[3]! / %cost%^)') do set gal=%%i set sell=%gal:~0,5% echo 加仑: %sell% ...
0赞 Stephan 7/5/2023
call :format "%gal%" sell
0赞 Chad 7/5/2023
好的,我将测试您的解决方案,并感谢您如此好心地为您的时间提供经验,为我提供此帮助
0赞 Chad 7/5/2023
您的解决方案再次运行良好,感谢您的时间、帮助和帮助。我现在唯一的问题是由于某种原因,当我从 bat 文件输入值时,我的程序数学不起作用(但那是在我使用的程序中,而不是 bat 文件)
0赞 Stephan 7/5/2023
不用担心,这就是我们来这里的目的。你可能想为你的数学问题问另一个问题(记得使用正确的标签)
0赞 Aacini 7/5/2023 #2

嗯。。。恐怕我真的不明白你想要什么(“减去正确的数字”是什么意思?...您的描述令人困惑,并且您(长)发布的代码没有显示重要的一点:文件的内容......无论如何,我认为我的答案可以帮助你。tmp.txt

在 Batch 文件中,命令管理整数 32 位数字,允许管理长达 9 位的十进制数。您可以将这 9 位数字拆分为整数和小数部分,并对它们执行简单的算术运算(本答案中描述的定点算术),只要中间结果(主要是乘法和除法)不会溢出 9 位容量。在这里:set /A

@echo off
setlocal EnableDelayedExpansion

set /P "decimals=Enter the number of decimals: "
set /A "decimalsP1=decimals+1, ONE=1"
for /L %%i in (1,1,%decimals%) do set "ONE=!ONE!0"
echo Enter numbers with digits at left of decimal point (like 0.25  not .25)

:loop
echo/
set /P "first=Enter first number: "
if errorlevel 1 goto :EOF
set /P "second=Enter second number: "
call :numToFP FPA=%first%
call :numToFP FPB=%second%
set /A "add=FPA+FPB, sub=FPA-FPB, mul=FPA*FPB/ONE, div=FPA*ONE/FPB
call :FPToNum add=%add%
call :FPToNum sub=%sub%
call :FPToNum mul=%mul%
call :FPToNum div=%div%
echo %first% op %second%:  Add = %add%, Sub = %sub%, Mul = %mul%, Div = %div%
goto loop


:numToFP FPvar=num
for /F "tokens=1,2 delims=." %%a in ("%~2") do (
   set "frac=%%b%ONE:~1%"
   set "%1=%%a!frac:~0,%decimals%!"
)
:cutZeros
if not defined %1 set "%1=0" & exit /B
if "!%1:~0,1!" equ "0" set "%1=!%1:~1!" & goto cutZeros
exit /B

:FPToNum var=FPnum
set "FP=%~2"
if "!FP:~%decimals%!" equ "" set "FP=%ONE:~1%%FP%" & set "FP=!FP:~-%decimalsP1%!"
set "%1=!FP:~0,-%decimals%!.!FP:~-%decimals%!"
exit /B

这样,您就不需要(缓慢的)PowerShell 来执行简单的除法。举个例子:

Enter the number of decimals: 3
Enter numbers with digits at left of decimal point (like 0.25  not .25)

Enter first number: 123
Enter second number: 0.456
123 op 0.456:  Add = 123.456, Sub = 122.544, Mul = 56.088, Div = 269.736