2014-02-11 195 views
27

我花了过去3小时试图解决这个问题,但找不到解决方案。这里是我的批处理脚本:如何在DOS下增加变量?

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的版本,并且它们在到达“PROBLEM”行时都会失败。

如果我这样做:

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

OR这样的:

set /A COUNTER+=1 
echo %Counter% 

都将返回一个空行,即它说明不了什么作为输出。

如果键入:

set /? 

话,就说明这一点:

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

SET [可变= [字符串]]

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

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

任何想法?

+0

我很*很确定普通DOS不能这样做。写一个实际的程序,而不是(有很多语言可供选择,例如[Turbo Pascal](http://edn.embarcadero.com/article/20803)或[C](http://www.delorie.com/ djgpp /),甚至可能是QBasic)。 –

+0

@Michael Madsen,我不熟悉这些语言,对于我的工作要求,我必须在DOS中运行批处理脚本。 – shadowz1337

+1

好的旧时代...... DOS下没有BASIC吗?如果我没有记错,它只有一个EXE,而且它很小(低于1 MB?) – Stephan

回答

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 
+0

嗯有没有更简单的方法? 250个周期只是一个例子,我实际上需要运行它3000多次..... – shadowz1337

+2

我知道这是现在老了,但我刚刚做了一些沿着这些线,我应该提到的是正确的代码是'if%COUNTER%== 1' ... –

+0

应该有一个更优雅的方式 –

1

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

下载的FreeDOS: http://chtaube.eu/computers/freedos/bootable-usb/

然后用我的Counter.exe文件(这基本上生成Counter.txt文件,每递增它被称为时间内的次数),我可以分配的值使用数字到一个变量:

Set /P Variable =< Counter.txt 

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

if %variable%==250 echo PASS 

顺便说一下,我仍然不能使用Set/A,因为FreeDOS不支持这个命令,但至少它支持Set/P命令。

49

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

您的代码包含的行

set /A COUNTER=%COUNTER%+1 

,并且将工作的语法很简单...

set /A COUNTER=COUNTER+1 

对SET命令所有的细节见http://ss64.com/nt/set.html。我只是认为我会为没有选择使用FreeDOS的任何人添加此解释。

+1

这个答案是错误的,因为这个问题是关于纯粹的MS-DOS而不是关于cmd.exe的。 – jeb

1

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

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

然后批处理代码可以用效用sed来模拟“wc -l”,按照你的循环(我只是用它来从1到n + 1开始执行时)递增:

只要记住手动创建一个文件 “的test.txt” 书面第一行


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

集/ A数= 1 +算

此使用Microsoft Windows [版本6.1.7601]

+0

问题是关于MSDos,**不**关于Windows – jeb

+0

DOS不存在,并且还没有20多年。问题不在于Windows和DOS,而在于批处理脚本,因此,这个答案是绝对正确的。 – Wigwam

3

工作对我来说有点晚了党,但它是一个interessting问题。

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

我没有使用DOS的 - PUH - 感觉就像几十年,但基于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%都可以使用,但我无法验证。

警告:因为没有“>”,或在DOS“<”比较,你应该在:finished标签删除该批处理文件(因为它继续递增和251不等于250了)

(PS :基本想法是从here。谢谢foxidrive。我知道,我知道它的StackOverflow,但已经很难找了一遍)

+0

Interessting解决方案,我测试它,它的工作原理,但你应该添加'> nul'到'复制init.txt + temp.txt varset.bat'以避免复制文本。它也有点慢,因为对于更大的值它变得越来越慢。 – jeb

+0

@jeb感谢您的反馈(我没有DOS测试)。是的,速度会变慢,但只要涉及重启等问题,我认为这并不重要。当柜台进入数万人时,这也可能是一个呃 - 次最佳的解决方案。 – Stephan

1
命令行

直接:

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 
+0

问题是关于Windows下的MS-DOS而不是cmd.exe。所以你的解决方案无法工作 – jeb