Подтвердить что ты не робот

Как увеличить переменную под 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.

Любые идеи?

4b9b3361

Ответ 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