Как увеличить переменную под DOS?
Я потратил последние 3 часа, пытаясь это выработать, но просто не смог найти решение. Здесь моя партия script:
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%
ИЛИ это:
set /A COUNTER+=1
echo %Counter%
оба возвращают пустую строку, т.е. она не показывает ничего как выход.
Если я напечатаю:
set /?
то он показывает это:
Отображает, устанавливает или удаляет переменные среды cmd.exe.
SET [variable = [string]]
variable Задает имя переменной среды.
string Указывает последовательность символов для назначения переменной.
но набрав ту же команду под CMD в Windows, вы увидите намного больше. Я думаю, что функция SET под DOS не поддерживает арифметические функции, но для работы я должен запускать свои скрипты только в DOS.
Любые идеи?
Ответы
Ответ 1
Я понимаю, что вы нашли другой ответ, но факт в том, что ваш исходный код был почти правильным, но для синтаксической ошибки.
В вашем коде содержалась строка
set /A COUNTER=%COUNTER%+1
и синтаксис, который будет работать, просто...
set /A COUNTER=COUNTER+1
См. http://ss64.com/nt/set.html для всех деталей команды SET. Я просто подумал, что добавлю это разъяснение для всех, у кого нет возможности использовать FreeDOS.
Ответ 2
Действительно, set
в DOS не имеет возможности разрешить арифметику. Однако вы можете сделать гигантскую таблицу поиска:
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
Ответ 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
Ответ 4
Я нашел свое решение.
Скачать 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.
Ответ 5
Непосредственно из командной строки:
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
Ответ 6
Я построил свой ответ благодаря предыдущим участникам.
Не имея времени для пользовательского counter.exe, я загрузил sed для FREEDOS.
И тогда пакетный код может быть, эмулируя "wc -l" с помощью утилиты sed, что-то вроде этого в соответствии с вашим циклом (я просто использую его для увеличения с помощью выполнения от "1" до n + 1):
Не забудьте вручную создать файл test.txt с записью в первой строке
0
sed -n '$=' test.txt > counter.txt
set /P Var=< counter.txt
echo 0 >> test.txt
Ответ 7
Я не использовал DOS для - puh - чувствует себя как десятилетия, но на основе старого ответа и моих воспоминаний следующее должно работать (хотя я не получил обратная связь, ответ был принят, поэтому он работает):
@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%
будут работать, но я не могу проверить.
ПРЕДУПРЕЖДЕНИЕ: поскольку нет " > " или "<" сравнение в DOS, вы должны удалить пакетный файл на метке :finished
(поскольку он продолжает увеличиваться и 251 больше не равен 250)
(PS: основная идея от здесь. Спасибо foxidrive. Я знал, я знал это из StackOverflow, но мне было трудно найти его снова)
Ответ 8
set/A count = 1 + count
Это работало для меня с использованием Microsoft Windows [Version 6.1.7601]
Ответ 9
Приходить на вечеринку очень и очень поздно, но из моей старой памяти о пакетных файлах 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
Ответ 10
Простое решение с использованием 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
Ответ 11
Это то, что я сделал для NSLOOKUP на разных IP-адресах, а затем записывает их в файл и сортирует.
@echo off
cls
IF NOT EXIST "%USERPROFILE%\Desktop\VLAN" mkdir "%USERPROFILE%\Desktop\VLAN"
IF NOT EXIST "%USERPROFILE%\Desktop\VLAN\Sorted" mkdir "%USERPROFILE%\Desktop\VLAN\Sorted"
:START
set COUNTER=0
set CYCLE=256
set /p VLAN= Enter VLAN:
:CYCLE
set /A COUNTER=COUNTER+1
IF %COUNTER% == %CYCLE% Goto :Stop
IF %COUNTER% NEQ %CYCLE% Goto :Work
:WORK
nslookup %VLAN%.%COUNTER% >> %USERPROFILE%\Desktop\VLAN\VLAN_%VLAN%_Search.txt
Goto :Cycle
:STOP
findstr "Name" %USERPROFILE%\Desktop\VLAN\VLAN_%VLAN%_Search.txt > %USERPROFILE%\Desktop\VLAN\Sorted\VLAN_%VLAN%_sorted_.txt
echo VLAN search for %VLAN% is complete
pause