Batch file 在DOS7中设置等效命令

Batch file 在DOS7中设置等效命令,batch-file,dos,windows-98,Batch File,Dos,Windows 98,我有一台运行DOS7.10的旧MS DOS计算机(ver命令给出:windows 98 ver 4.10.2222)。我必须制作一个批处理脚本,基本上运行命令10次或任何时间。我尝试使用for命令,但它给了我非法的for命令 所以现在我有: @ECHO off SET COUNT=0 :MyLoop IF "%COUNT%" == "10" GOTO EndLoop ECHO %COUNT% SET /a COUNT+=1 :EndLoop ECHO done 然而,这给了我一个0的无限循

我有一台运行DOS7.10的旧MS DOS计算机(ver命令给出:windows 98 ver 4.10.2222)。我必须制作一个批处理脚本,基本上运行命令10次或任何时间。我尝试使用for命令,但它给了我非法的for命令 所以现在我有:

@ECHO off
SET COUNT=0

:MyLoop
IF "%COUNT%" == "10" GOTO EndLoop
ECHO %COUNT%
SET /a COUNT+=1
:EndLoop 
ECHO done
然而,这给了我一个0的无限循环,就好像set命令不起作用一样。不过,该命令在windows 10的CMD中确实有效。有人能指出我做错了什么吗?或者一种在DOS7批处理文件中实现for循环的方法

for %%a in (1 2 3 4 5 6 7 8 9 10) do echo %%a
对你来说应该是1到10


除此之外,您还需要在需求中更加明确。

在MS-DOS中,
set
命令没有算术选项
/A
。对于
for
循环,也没有
/L
选项

所以你要么这样做:

@echo关闭
计数=
:循环
如果“%COUNT%”==“\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
设置计数=%COUNT%_
回显%COUNT%
转到环路
:退出
回音完成
或者像这样:

@echo关闭
对于(1 2 3 4 5 6 7 8 9 10)中的%%I,执行回显%%I
回音完成

如果您想进行多次迭代,您可以在第一种方法中这样做:

@echo关闭
rem//这将执行1000次迭代:
计数=
设限=__________
设置限制=%LIMIT%%LIMIT%%LIMIT%%LIMIT%%LIMIT%%LIMIT%%LIMIT%%LIMIT%%LIMIT%%LIMIT%LIMIT%
设置限制=%LIMIT%%LIMIT%%LIMIT%%LIMIT%%LIMIT%%LIMIT%%LIMIT%%LIMIT%%LIMIT%%LIMIT%LIMIT%
:循环
如果“%COUNT%”==“LIMIT%”转到退出
设置计数=%COUNT%_
回显%COUNT%
转到环路
:退出
回音完成
或者像这样的第二个:

@echo关闭
rem//这将执行1000次迭代:
对于%%I in(1 2 3 4 5 6 7 8 9 10)do for%%J in(1 2 3 4 5 6 7 8 9 10)do for%%K in(1 2 3 4 5 6 7 8 9 10)do echo%%I,%%J,%%K
回音完成

此批处理文件按您的要求执行。按原样,本例最多可计算123次,但最多可计算999次(根据您的要求,可计算1000次)。如果您需要更多数字,只需添加相应的部分

编辑2018年3月27日:根据评论建议修改代码

编辑2018年3月29日:第二次尝试

编辑:添加新方法

这种更简单的方法可以管理计数器中任意数量的数字,无需修改:

@echo off
if not "%1" == "" goto %1

set myself=%0

set count=0

:MyLoop
   call %myself% :incCount 
   echo %printCnt%
if not "%printCnt%" == "123" goto MyLoop
echo Done
goto :EOF


:incCount
set newCnt=
set printCnt=
set carry=1
for %%a in (%count%) do call %myself% :incDigit %%a
set count=%newCnt%
if %carry% == 0 goto :EOF
set count=%count%,1
set printCnt=1%printCnt%
goto :EOF

:incDigit digit
set digit=%2
if %carry% == 0 goto endIncDigit
if not %2 == 9 goto next
   set digit=0
   goto endIncDigit
:next
if %2 == 8 set digit=9
if %2 == 7 set digit=8
if %2 == 6 set digit=7
if %2 == 5 set digit=6
if %2 == 4 set digit=5
if %2 == 3 set digit=4
if %2 == 2 set digit=3
if %2 == 1 set digit=2
if %2 == 0 set digit=1
set carry=0
:endIncDigit
set newCnt=%newCnt%,%digit%
set printCnt=%digit%%printCnt%

:EOF
这是MS Dos/Win98的“通用”增量函数。 数值的数字必须用逗号分隔。 结果将存储在同一个变量和用于打印的辅助变量中(不带逗号)。
此解决方案可以扩展到解决任何算术计算

@echo off
if not "%1" == "" goto %1

set counter=0

:loop
call %0 :inc counter print_cnt
echo counter=%print_cnt%
goto :loop
goto :eof

REM *************************************
:inc
set _self=%0
set _counterVar=%2
set _counterPrintVar=%3
set _rev=
set _result=
set _printResult=
set _carry=1
call %_self% :GetIndirectVar _counter %_counterVar%
call %_self% :reverse %_counter%
set %_counterVar%=%_result%
set %_counterPrintVar%=%_printResult%
goto :eof

REM *************************************
:GetIndirectVar
for %%a in (%3) do echo set %2=%%%%a%% > tmp.bat
call tmp.bat
del tmp.bat
goto :eof

REM *************************************
:reverse
if "%2" == "" goto :_add_start
set _rev=%2,%_rev%
shift
goto :reverse

:_add_start
for %%a in (%_rev%) do call %_self% :add_digit %%a
if "%_carry%" == "0" goto :eof
set _digit=1
goto :_add_digit_end

REM *************************************
:add_digit
set _digit=%2
rem echo d=%2 carry=%_carry%
if "%_carry%" == "0" goto :_add_digit_end
set _carry=0

if "%_digit%" == "9" set _carry=1
if "%_digit%" == "9" set _digit=0
if "%_carry%" == "1" goto :_add_digit_end
if "%_digit%" == "8" set _digit=9
if "%_digit%" == "7" set _digit=8
if "%_digit%" == "6" set _digit=7
if "%_digit%" == "5" set _digit=6
if "%_digit%" == "4" set _digit=5
if "%_digit%" == "3" set _digit=4
if "%_digit%" == "2" set _digit=3
if "%_digit%" == "1" set _digit=2
if "%_digit%" == "0" set _digit=1

:_add_digit_end
set _result=%_digit%,%_result%
set _printResult=%_digit%%_printResult%
goto :eof

:eof
您也可以将其用作“外部”增量函数,只需将其命名为“increm.bat”


@JeffZeitlin-DOS没有延迟的扩展。我没有一台Windows 98机器要测试,但我相当确定这是行
set/a count+=1
的问题。尝试将其扩展到
set/a count=%count%+1
重新阅读这个问题,我甚至不确定Win98命令行是否支持set/a;Windows XP之前的变量-甚至在XP中-总是字符串,而不是数字。我记得在那些日子里,为了循环五次,我不得不在(12345)中为%I做
是的,@JeffZeitlin,在DOS中,没有
设置/A
;对于/L,两者都不是
。因此,您必须对%%I in(1 2 3…)do
使用
,或者,如果您想使用
goto
循环,
设置“COUNT=%COUNT%\ucode>和
如果“%COUNT%=”\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuu=”
。在与
command.com
兼容的情况下,使用
cmd.exe
作为命令解释器在较新的Windows上测试批处理文件非常容易。使用
setlocaldisableextensions
在较新的Windows上启动批处理文件,并且
cmd.exe
command.com
一样解释批处理文件
cmd/?
输出受启用/禁用的命令扩展影响的(most)命令。每个受影响命令的单独帮助说明了哪些功能/选项需要启用命令扩展。一旦批处理文件在具有禁用命令扩展名的较新Windows上运行,就应该在MS-DOS或Windows 95/98上测试它。老实说,Damn希望有一个更优雅的解决方案,因为如果我必须迭代1000次,我将不得不数到1000次……这是可以做到的。我们需要知道您正在尝试做什么,这样我们就不会为您可能正在做的事情提供所有可能的解决方案。啊,好的,所以我正在尝试创建一个批处理文件,我将使用它一次调用两个单独的程序。我有一个分光计,它的光圈将由一个程序和一个带光源的步进电机控制,所以基本上我想通过程序1逐步打开光圈并读取读数,然后通过程序2移动电机以结束循环并冲洗和重复。所以在理论上:有一个i=1到1000或w.e的循环(必须在看到两个结果后决定)调用Program1 Good try,但command.com不能调用labels。此外,扩展集语法未知。如果你不介意的话,你的想法的基本原理应该不会有什么帮助,对不起,我有点不确定。。。如果我尝试按原样实现您的脚本,它会给我语法错误和一个无限循环,输出为:0 syntaxerrops!我的错<代码>:(
Change
如果“%1”neq“转到%1
通过
如果不是“%1”==“转到%1
(我已经在代码中这样做了)。如果仍然显示错误,请删除
@echo off
行,通过
“2”更改
“123”
,再次运行程序并报告错误发生的准确行…好的,是的,这很有帮助,现在循环可以上升到9,然后它开始给出语法错误。我尝试删除&并按顺序将其作为单独的if条件,这使代码从1变为9,但在c之后,pc耗尽了变量的内存空间如果那个帮助我尝试了你的方法,那么会有两个循环,但是它会像counter=1 counter=112 1113 1114,依此类推,直到它在某个地方耗尽了空间
@echo off
if not "%1" == "" goto %1

set counter=0

:loop
call %0 :inc counter print_cnt
echo counter=%print_cnt%
goto :loop
goto :eof

REM *************************************
:inc
set _self=%0
set _counterVar=%2
set _counterPrintVar=%3
set _rev=
set _result=
set _printResult=
set _carry=1
call %_self% :GetIndirectVar _counter %_counterVar%
call %_self% :reverse %_counter%
set %_counterVar%=%_result%
set %_counterPrintVar%=%_printResult%
goto :eof

REM *************************************
:GetIndirectVar
for %%a in (%3) do echo set %2=%%%%a%% > tmp.bat
call tmp.bat
del tmp.bat
goto :eof

REM *************************************
:reverse
if "%2" == "" goto :_add_start
set _rev=%2,%_rev%
shift
goto :reverse

:_add_start
for %%a in (%_rev%) do call %_self% :add_digit %%a
if "%_carry%" == "0" goto :eof
set _digit=1
goto :_add_digit_end

REM *************************************
:add_digit
set _digit=%2
rem echo d=%2 carry=%_carry%
if "%_carry%" == "0" goto :_add_digit_end
set _carry=0

if "%_digit%" == "9" set _carry=1
if "%_digit%" == "9" set _digit=0
if "%_carry%" == "1" goto :_add_digit_end
if "%_digit%" == "8" set _digit=9
if "%_digit%" == "7" set _digit=8
if "%_digit%" == "6" set _digit=7
if "%_digit%" == "5" set _digit=6
if "%_digit%" == "4" set _digit=5
if "%_digit%" == "3" set _digit=4
if "%_digit%" == "2" set _digit=3
if "%_digit%" == "1" set _digit=2
if "%_digit%" == "0" set _digit=1

:_add_digit_end
set _result=%_digit%,%_result%
set _printResult=%_digit%%_printResult%
goto :eof

:eof
@echo off
set myCounterA=9,9
call increm.bat :inc myCounterA output
echo The new value is %output%