我花了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下运行我的脚本。
有什么想法吗?
答案 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 /a
和set /p
都不存在,所以我们必须解决这个问题。
我认为for %%i in (%variable%) do set numb=%%i
和set 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