Batch file 如何在DOS下增加变量?

Batch file 如何在DOS下增加变量?,batch-file,dos,Batch File,Dos,我花了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 &l

我花了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
或者这个:

set /A COUNTER+=1
echo %Counter%
两者都将返回一个空行,即输出时不显示任何内容

如果我键入:

set /?
然后它显示:

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

设置[变量=[字符串]]

变量指定环境变量名称。
字符串指定要分配给变量的一系列字符

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


有什么想法吗?

事实上,DOS中的
set
没有允许算术运算的选项。不过,您可以创建一个巨大的查找表:

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

我找到了自己的解决办法

从此处下载FreeDOS:

然后使用我的Counter.exe文件(该文件基本上生成一个Counter.txt文件,每次调用时递增其中的数字),我可以使用以下方法将数字的值分配给变量:

Set /P Variable =< Counter.txt

顺便说一句,我仍然不能使用Set/A,因为FreeDOS不支持此命令,但至少它支持Set/p命令。

我知道您找到了另一个答案-但事实是,您的原始代码几乎是正确的,只是语法错误

你的代码包含了这一行

set /A COUNTER=%COUNTER%+1
有效的语法就是

set /A COUNTER=COUNTER+1

有关SET命令的所有详细信息,请参见。我只是想为那些没有使用FreeDOS选项的人补充一点说明

感谢以前的贡献者,我构建了我的答案

没有时间自定义counter.exe,我下载了

然后,批处理代码可以是,使用实用程序sed模拟“wc-l”,根据您的循环,类似于这样(我只是使用它通过从“1”到n+1的执行递增):

请记住手动创建一个文件“test.txt”,第一行写有

0


sed-n'$='test.txt>counter.txt
set/P Var=>test.txt

派对有点晚了,但这是一个有趣的问题

您可以编写自己的inc.bat来递增数字。
它可以将数字从0增加到9998

@echo off
if "%1"==":inc" goto :increment

call %0 :inc %counter0%
set counter0=%_cnt%
if %_overflow%==0 goto :exit 

call %0 :inc %counter1%
set counter1=%_cnt%
if %_overflow%==0 goto :exit 

call %0 :inc %counter2%
set counter2=%_cnt%
if %_overflow%==0 goto :exit 

call %0 :inc %counter3%
set counter3=%_cnt%
goto :exit

:increment
set _overflow=0
set _cnt=%2

if "%_cnt%"=="" set _cnt=0

if %_cnt%==9 goto :overflow
if %_cnt%==8 set _cnt=9
if %_cnt%==7 set _cnt=8
if %_cnt%==6 set _cnt=7
if %_cnt%==5 set _cnt=6
if %_cnt%==4 set _cnt=5
if %_cnt%==3 set _cnt=4
if %_cnt%==2 set _cnt=3
if %_cnt%==1 set _cnt=2
if %_cnt%==0 set _cnt=1
goto :exit

:overflow
set _cnt=0
set _overflow=1
goto :exit

:exit
set count=%counter3%%counter2%%counter1%%counter0%
这里有一个使用它的示例

@echo off
set counter0=0
set counter1=
set counter2=
set counter3=

:loop
call inc.bat
echo %count%
if not %count%==250 goto :loop

我没有使用DOS for-puh-感觉像是几十年了,但是基于我的记忆,以下应该可以工作(虽然我没有得到反馈,但答案被接受,所以它似乎可以工作):

在DOS中,既不存在
set/a
也不存在
set/p
,因此我们必须解决这个问题。 我认为%%I in(%variable%)的
设置numb=%I
设置numb2=%variable%
都可以工作,但我无法验证


警告:由于命令行中没有“>”或“”:

 for /L %n in (1,1,100) do @echo %n
使用批处理文件:

 @echo off
 for /L %%n in (1,1,100) do echo %%n
显示:

 1
 2
 3
 ...
 100

很晚才来参加聚会,但从我以前的DOS批处理文件记忆中,你可以在每个循环中不断向字符串中添加一个字符,然后查找一个包含这么多字符的字符串。对于250次迭代,你要么有很长的“循环”字符串,或者在内部有一个循环使用一组变量计数到10,然后在外部有另一个循环使用另一组变量计数到25

以下是到30的基本循环:

@echo off
rem put how many dots you want to loop
set cycles=..............................
set cntr=
:LOOP
set cntr=%cntr%.
echo around we go again
if "%cycles%"=="%cntr%" goto done
goto loop
:DONE
echo around we went

这些似乎都不适合我:

@ECHO OFF

REM 1. Initialize our counter
SET /A "c=0"

REM Iterate through a dummy list. 
REM Notice how the counter is used: "CALL ECHO %%c%%" 
FOR /L %%i in (10,1,20) DO (

  REM 2. Increment counter
  SET /A "c+=1"

  REM 3. Print our counter "%c%" and some dummy data "%%i"
  CALL ECHO Line %%c%%: - Data: %%i
)
答案摘自:(部分:数组的长度)

结果:

Line 1: - Data: 10
Line 2: - Data: 11
Line 3: - Data: 12
Line 4: - Data: 13
Line 5: - Data: 14
Line 6: - Data: 15
Line 7: - Data: 16
Line 8: - Data: 17
Line 9: - Data: 18
Line 10: - Data: 19
Line 11: - Data: 20

我很确定普通DOS做不到这一点。写一个实际的程序(有很多语言可供选择,例如,或者,甚至QBasic)。@Michael Madsen,我不熟悉这些语言,出于我的工作需要,我必须在DOS中运行批处理脚本。过去的好时光。。。DOS不是提供了一个基本的吗?如果我没记错的话,它只有一个EXE,而且非常小(低于1MB?@shadowz1337):您的作业要求是否明确规定它必须是一个批处理脚本,或者只是它必须在DOS中运行?我提到的所有编译器/语言都运行在普通的16位DOS中,要编写这样的程序,需要学习的东西很少。第1行和第2行将在MSDos中工作。第3行和第4行将给出语法错误。你确定你在使用MSDO吗?嗯,有没有更简单的方法?250次循环只是一个例子,我实际上需要运行3000多次……我知道这已经过时了,但是我刚刚做了一些类似的事情,我应该提到正确的代码是
如果%COUNTER%==1
…应该有一个更优雅的way@K.Mulier:我们谈论的是80年代家庭用户操作系统中的shell。批处理文件的作用仅仅是按顺序执行一些命令,而不是算术。嗨@Joey,你说得对。我很抱歉投了反对票。刚刚把它转换成一个向上投票;-)这个答案是错误的,因为这个问题是关于纯MS-DOS的,而不是关于cmd.exe的。它甚至更错误,因为
set/a var=%var%+1
工作正常(尽管不推荐)@niico因为这个答案中的示例适用于大多数人现在实际使用的现代版本的Windows。对于实际提出的问题,这不是正确的答案,但对于那些想知道如何在现代版本的Windows上增加变量的人来说,这是正确的答案。有趣的解决方案,我测试了它,它可以工作,但您应该将
>nul
添加到
copy init.txt+temp.txt varset.bat
以避免复制文本。它也有点慢,因为对于更大的值,它会越来越慢。@jeb感谢您的反馈(我没有要测试的DOS)。是的,它会变慢,但我认为只要涉及到重启之类的事情,它就不重要了。当计数器达到一万时,这可能是一个次优的解决方案。问题是关于Windows下的MS-DOS而不是cmd.exe。因此,您的解决方案无法工作问题是关于Windows下的MS-DOS而不是cmd.exe。所以你的解决方案是c
 1
 2
 3
 ...
 100
@echo off
rem put how many dots you want to loop
set cycles=..............................
set cntr=
:LOOP
set cntr=%cntr%.
echo around we go again
if "%cycles%"=="%cntr%" goto done
goto loop
:DONE
echo around we went
@ECHO OFF

REM 1. Initialize our counter
SET /A "c=0"

REM Iterate through a dummy list. 
REM Notice how the counter is used: "CALL ECHO %%c%%" 
FOR /L %%i in (10,1,20) DO (

  REM 2. Increment counter
  SET /A "c+=1"

  REM 3. Print our counter "%c%" and some dummy data "%%i"
  CALL ECHO Line %%c%%: - Data: %%i
)
Line 1: - Data: 10
Line 2: - Data: 11
Line 3: - Data: 12
Line 4: - Data: 13
Line 5: - Data: 14
Line 6: - Data: 15
Line 7: - Data: 16
Line 8: - Data: 17
Line 9: - Data: 18
Line 10: - Data: 19
Line 11: - Data: 20