gpt4 book ai didi

batch-file - 如何在原始DOS中获得2个数字的总和?

转载 作者:行者123 更新时间:2023-12-04 19:26:40 25 4
gpt4 key购买 nike

我想重温旧日的怀旧之情。
我一直在测试一些批处理命令,但我注意到 /a在dos中不可用。
有没有另一种方法可以用来添加两个变量而不包括 /a ?

@echo off
::this is how I would originally add two numbers
set /p number1=
set /p number2=
set /a "number1=number1+number2"
echo %number1%
pause >nul
exit

DOS 状态 "invalid switch. - /a"当我运行这个程序时。

最佳答案

这比使用 set /a 有点棘手。 , 但可以用 MS-DOS 6.22 解决。
一部分是编写一个添加单个数字的函数和一个可以添加多个数字的函数。
主要问题是将数字拆分为单个数字,因为 MS-DOS 不支持字符串操作。
但它在 FOR 循环处理中存在一个小缺陷,/将文本分成三个部分。

for %%a in (`abcdef/ghijklmno`) do echo %%a
输出
abcdef
g
hijklmno

有了这个技巧,一个数字可以分成个位数
split.bat
@echo off
for %%P in (/%1.) do if %%P==: goto %1

set _idx=
set _remain=%2
set _splitRev=
set _splitRev_comma=

:loop

set _loop=1

for %%a in (/%_remain%) do call %0 :split %1 %%a
if NOT "%_remain%"=="" goto :loop
set %1=%_splitRev%
set %1_comma=%_splitRev_comma%

REM Clear temp vars
FOR %%v in (_remain _idx _loop _splitRev _splitRev_comma) do set %%v=
goto :eof

:split
if %_loop%%==2 goto :split_2
set _loop=2
set _remain=
set _splitRev=%3%_splitRev%
set _splitRev_comma=%3,%_splitRev_comma%
goto :eof

:split_2
set _remain=%3
goto :eof

:eof
添加.bat 好像
@echo off
for %%P in (/%1.) do if %%P==: goto %1

call split _valueRev1 %1
call split _valueRev2 %2

set _result=
set _carry=
for %%d in (%_valueRev1_comma%,0,0,0,0,0) do call %0 :getDig1 %%d


REM Remove leading zeros
:zeroLoop
for %%z in (/%_result%) do set _remain=%%z
if not %_result%==0%_remain% goto :finish
set _result=%_remain%
goto :zeroLoop

:finish
echo %1+%2=%_result%

REM Clear temp vars
FOR %%v in (_result _carry _len _digit1 _digit2 _remain _valueRev1 _valueRev1_comma _valueRev2 _valueRev2_comma) do set %%v=
goto :eof

:getDig1
set _digit1=%2
set _digit2=
for %%d in (/%_valueRev2%0) do call %0 :getDig2 %%d

set _len=%_carry%
call %0 :lenAddDigit %_digit1%
call %0 :lenAddDigit %_digit2%
call %0 :len2val
set _result=%_val%%_result%
goto :eof

:getDig2
if not "%_digit2%"==" set _valueRev2=%2
if "%_digit2%"=="" set _digit2=%2
goto :eof

:lenAddDigit
if %2==1 set _len=%_len%#
if %2==2 set _len=%_len%##
if %2==3 set _len=%_len%###
if %2==4 set _len=%_len%####
if %2==5 set _len=%_len%#####
if %2==6 set _len=%_len%######
if %2==7 set _len=%_len%#######
if %2==8 set _len=%_len%########
if %2==9 set _len=%_len%#########
goto :eof

:len2val
set _carry=
set _val=
if %_len%.==. set _val=0
if %_len%.==. goto :eof
if %_len%==# set _val=1
if %_len%==## set _val=2
if %_len%==### set _val=3
if %_len%==#### set _val=4
if %_len%==##### set _val=5
if %_len%==###### set _val=6
if %_len%==####### set _val=7
if %_len%==######## set _val=8
if %_len%==######### set _val=9
if NOT "%_val%"=="" goto :eof
set _carry=#

if %_len%==########## set _val=0
if %_len%==########### set _val=1
if %_len%==############ set _val=2
if %_len%==############# set _val=3
if %_len%==############## set _val=4
if %_len%==############### set _val=5
if %_len%==################ set _val=6
if %_len%==################# set _val=7
if %_len%==################## set _val=8
if %_len%==################### set _val=9
goto :eof

:eof
在 MS-DOS 6.22 (VMWare) 上成功测试
#MS-DOS 6.22 的限制
  • IF不支持 ELSE解决方法:
     IF %1==b echo It is equal
    IF NOT %1==b echo It isn't equal
  • 仅限 goto可以跳转到标签,CALL只能开始另一批。
    解决方法:
    将这样的内容放入批处理的第一行
     FOR %%P in (/%1) do IF %%P==: goto %1
    ...
    REM This calls the current batch file and jumps to a label
    CALL %0 :myLabel arg1
    ...
    :myLabel
    echo arg1=%2
    echo Action1
    echo Action2
    goto :eof
  • 没有代码块,比如
     FOR %%a in (1 2 3 ) do ( 
    set concat=%%a
    echo %concat%
    )
    解决方法:
     FOR %%a in (1 2 3 ) do CALL %0 :myFunc %%a
  • 没有变量的间接扩展
    解决方法:
     set var=content
    set indirect=var
    > temp$$$.bat echo set result=%%%indirect%%%
    call temp$$$.bat
    echo result=%result%
  • 关于batch-file - 如何在原始DOS中获得2个数字的总和?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54157198/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com