2014-02-11 125 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