如何在DOS下增加变量?

sha*_*337 37 dos batch-file

我花了3个小时试图解决这个问题,但却找不到解决方案.这是我的批处理脚本:

if NOT Exist Counter.txt GOTO START
Type c:\counter.txt
if %COUNTER% EQU %Cycles% goto Pass
if NOT %COUNTER% EQU %Cycles% goto Cycle

:START
Set COUNTER=0
set CYCLES=250

:Cycle
set /A COUNTER=%COUNTER%+1     <----------- PROBLEM
echo Iteration %COUNTER% of %CYCLES%
echo Delay 3 seconds to reboot
choice /cy /n /t:y,3
warmboot.com

:Pass
pause
Run Code Online (Sandbox Code Playgroud)

它正在做的是运行文件"warmboot.com"(重新启动我的电脑)并运行250个周期.一旦循环运行250次(即当计数器等于循环时),它就会停止.

在Windows下,这是有效的.但是,这在DOS环境下不起作用.我已经尝试了从v4到v6.22甚至v7的版本,当它到达"问题"行时它们都会失败.

如果我这样做:

set /A COUNTER=%COUNTER%+1
echo %Counter%
Run Code Online (Sandbox Code Playgroud)

或这个:

set /A COUNTER+=1
echo %Counter%
Run Code Online (Sandbox Code Playgroud)

两者都将返回一个空行,即它不显示任何输出.

如果我输入:

set /?
Run Code Online (Sandbox Code Playgroud)

然后它显示了这个:

显示,设置或删除cmd.exe环境变量.

SET [variable = [string]]

variable指定环境变量名称.
string指定要分配给变量的一系列字符.

但在Windows下的CMD下键入相同的命令会显示更多内容.我认为DOS下的SET函数不支持算术函数,但出于工作目的,我只能在DOS下运行我的脚本.

有任何想法吗?

小智 61

我意识到你已经找到了另一个答案 - 但事实是你的原始代码几乎是正确的但是语法错误.

您的代码包含该行

set /A COUNTER=%COUNTER%+1
Run Code Online (Sandbox Code Playgroud)

可行的语法很简单......

set /A COUNTER=COUNTER+1
Run Code Online (Sandbox Code Playgroud)

有关SET命令的所有详细信息,请参见http://ss64.com/nt/set.html.我只是想为其他没有使用FreeDOS选项的人添加这个说明.

  • 这个答案是错误的,因为问题是关于纯MS-DOS,而不是关于cmd.exe. (4认同)
  • @niico 因为这个答案中的示例适用于大多数人今天实际使用的现代版本的 Windows。这不是实际提出的问题的正确答案,但对于想知道如何在现代版本的 Windows 上增加变量的人来说,这是正确的答案。 (4认同)
  • 甚至更错误,因为`set / a var =%var%+ 1`可以正常工作(尽管不推荐) (2认同)

Joe*_*oey 5

确实,set在DOS中没有允许算术的选项。不过,您可以做一个巨大的查询表:

if %COUNTER%==249 set COUNTER=250
...
if %COUNTER%==3 set COUNTER=4
if %COUNTER%==2 set COUNTER=3
if %COUNTER%==1 set COUNTER=2
if %COUNTER%==0 set COUNTER=1
Run Code Online (Sandbox Code Playgroud)

  • 嗯,有更简单的方法吗?250个循环只是一个例子,我实际上需要运行它超过3000次...... (2认同)
  • 我知道这已经很老了,但是我已经按照这些原则做了一些事情,我应该指出正确的代码是`if%COUNTER%== 1` ... (2认同)
  • @K.Mulier:我们谈论的是 80 年代家庭用户操作系统中的 shell。批处理文件仅适用于按顺序执行多个命令,而不是算术。 (2认同)