如何在DOS下增加变量?

时间:2014-02-11 08:59:14

标签: 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     <----------- PROBLEM
echo Iteration %COUNTER% of %CYCLES%
echo Delay 3 seconds to reboot
choice /cy /n /t:y,3
warmboot.com

:Pass
pause

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

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

如果我这样做:

set /A COUNTER=%COUNTER%+1
echo %Counter%

或者这个:

set /A COUNTER+=1
echo %Counter%

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

如果我输入:

set /?

然后它显示了这个:

  

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

     

SET [variable = [string]]

     

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

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

有什么想法吗?

10 个答案:

答案 0 :(得分:61)

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

您的代码包含

set /A COUNTER=%COUNTER%+1

和可行的语法就是......

set /A COUNTER=COUNTER+1

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

答案 1 :(得分:4)

实际上,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

答案 2 :(得分:3)

派对有点迟,但这是一个非常棘手的问题。

您可以编写自己的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

答案 3 :(得分:2)

直接来自命令行:

 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

答案 4 :(得分:1)

我找到了自己的解决方案。

从这里下载FreeDOS: http://chtaube.eu/computers/freedos/bootable-usb/

然后使用我的Counter.exe文件(基本上生成一个Counter.txt文件并在每次调用时增加数字内),我可以使用以下命令将数字的值赋给变量:

Set /P Variable =< Counter.txt

然后,我可以通过执行以下操作检查它是否已运行250个循环:

if %variable%==250 echo PASS

BTW,我仍然无法使用Set / A,因为FreeDOS不支持此命令,但至少它支持Set / P命令。

答案 5 :(得分:1)

感谢以前的贡献者,我建立了自己的答案。

没有时间使用自定义counter.exe,我下载了sed for FREEDOS

然后批处理代码可能是,用实用程序sed模拟“wc -l”,根据你的循环这样的东西(我只是用它来递增从“1”到n + 1的执行): / p>

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

  

0

/p:VisualStudioVersion=12.0

答案 6 :(得分:1)

我没有使用DOS - 感觉 - 几十年,但基于an old answer和我的记忆,以下应该有效(虽然我没有反馈,答案被接受了,所以看来工作):

@echo off
  REM init.txt should already exist
  REM to create it:
  REM   COPY CON INIT.TXT
  REM   SET VARIABLE=^Z
  REM ( press Ctrl-Z to generate ^Z )
  REM
  REM also the file "temp.txt" should exist.
REM add another "x" to a file:
echo x>>count.txt
REM count the lines in the file and put it in a tempfile:
type count.txt|find /v /c "" >temp.txt

REM join init.txt and temp.txt to varset.bat:
copy init.txt+temp.txt varset.bat
REM execute it to set %variable%:
call varset.bat

for %%i in (%variable%) do set numb=%%i
echo Count is: %numb%
   REM just because I'm curious, does the following work? :
   set numb2=%variable%
   echo numb2 is now %var2%
if %numb%==250 goto :finished
echo another boot...
warmboot.exe
:finished
echo that was the last one.

在DOS中,set /aset /p都不存在,所以我们必须解决这个问题。 我认为for %%i in (%variable%) do set numb=%%iset numb2=%variable%都有效,但我无法验证。

警告:因为没有&#34;&gt;&#34;或&#34;&lt;&#34;在DOS中比较时,你应该删除:finished标签上的批处理文件(因为它继续增加,251不再等于250)

(PS:基本想法来自here。感谢foxidrive。我知道,我从StackOverflow知道它,但很难再找到它)

答案 7 :(得分:0)

非常晚才参加派对,但是从我对DOS批处理文件的旧记忆中,你可以继续在字符串中添加一个字符,然后每个循环查找该字符串中的许多字符串。对于250次迭代,你要么有一个很长的&#34;周期&#34;字符串,或者你有一个循环使用一组计数到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

答案 8 :(得分:-1)

使用set /a

的简单解决方案
@CLS
@break on
@echo off
@Echo Begin PING/TraceRT Test - Version 1.0    8/16/2019
@Echo.
@echo.
@Echo  If %%1=-1, then unlimited runs, otherwise run only '%1' times and end.
@Echo  If unlimited, use ctrl-break/Ctrl-C to stop
@echo.
@echo.
if "%1"=="" goto end
set /A COUNTER=0

set /a START=COUNTER+1
ECHO                                     The total Runs so far is :  "-  %START%  -"

@Echo Logging Started >> ping-cap.txt
:Loop-Unlimited
IF "%COUNTER%"=="%1" GOTO END
set /A COUNTER=COUNTER+1
@time /T >> ping-cap.txt
@date /T >> ping-cap.txt
@ping charter.com >> ping-cap.txt
@tracert charter.com >> ping-cap.txt
@echo                                                                                    Loop Count is:  %COUNTER% >> ping-cap.txt

ECHO                                                                                    The total Runs so far is :  "-  %COUNTER%  -" 
GOTO Loop-Unlimited
goto end
:end
echo ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ   Ending test   ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

答案 9 :(得分:-2)

这些似乎都不适合我:

@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
)

答案摘自:https://www.tutorialspoint.com/batch_script/batch_script_arrays.htm(部分:数组的长度

结果:

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