2

Я думаю, что это вопрос о переменной области. Я пытаюсь понять, почему переменная% medium% может содержать что-то кроме "0", когда среднее значение эхо- строки до достижения echo average before %average% достигнуто.

Кажется, он содержит значение из предыдущего цикла. Он также не обновляется с помощью следующего set /a и остается таким же в echo average after %average% . Следующий цикл вокруг цикла имеет правильное значение по сравнению с предыдущим, но не в этот раз.

@echo off
setlocal
set count=1
set four=0
set ping1=0
set ping2=0
set ping3=0
set ping4=0
set average=0
:loop
set pingtime=
set striptime=
@for /f "tokens=3 delims=="    %%G in ('ping -n 1 8.8.8.8 ^| find "Reply from"') do set pingtime=%%G
rem set pingtime=time=100ms
echo "ping %pingtime%"    
if "%pingtime%"=="" (
    set striptime=6666
) else (
rem    set striptime=%pingtime:~5,6%
rem    echo "Strip1 %striptime%"    
    set striptime=%pingtime:ms TTL=%
    echo Strip2=%striptime%
)
set ping%count%=%striptime%
@echo ping%count% time=%striptime%

echo %ping1% %ping2% %ping3% %ping4%    
set /a count+=1
if %count%==5 (
    set count=1
    set four=1
)
rem echo "Four= %four%"
if %four%==1 (
    set average=0
    echo average before=%average%
    echo %ping1% %ping2% %ping3% %ping4%    
    set /a average=%ping1%+%ping2%+%ping3%+%ping4%
    echo average after=%average%
    if %average% GTR 2500 (
     set four=0
         set ping1=0
         set ping2=0
         set ping3=0
         set ping4=0
     rasdial nextgdu /disconnect
     rasdial nextgdu
     rem | choice /c:ab /t:A,2 > NUL
    )
)
goto loop

2 ответа2

3

Я собирался опубликовать это как комментарий, но поле ответа имеет более удобные элементы управления форматированием.

JdeBP полностью прав в своем ответе, но некоторые исправления из вашего кода могут прояснить ситуацию, если вы еще не пришли к ответу (видя, как я публикую это через месяц).

Сначала измените setlocal на setlocal EnableDelayedExpansion . Это включает отложенное расширение.

Затем измените все переменные, на которые ссылается синтаксис %variable_name% на !variable_name! воспользоваться функцией отложенного расширения. Таким образом, на любую переменную, которая оценивается или изменяется в цикле for, нужно получить правильные / ожидаемые результаты.

Например, эта строка в вашем коде:

echo "ping %pingtime%"

следует изменить на

echo "ping !pingtime!"

Существует довольно хорошее объяснение замедленного расширения здесь с примерами , чтобы проиллюстрировать то , что происходит.

2

Я думаю, что это вопрос о переменной области.

Это не так. Командные скрипты не имеют понятия областей для переменных. То , что вы столкнулись с является хорошо известно и многими десятилетиями 1 проблемой подстановки переменной в составной команде , предшествующей часть этой составной команды , которая устанавливает переменную в новое значение. То же самое можно увидеть и с простым двухслойным материалом:

set A=ONE
set A=TWO & echo %A%

Расширение переменной во второй строке, представляющее собой составную команду, происходит при разборе команды, что происходит до того, как какая-либо ее часть будет выполнена в интерпретаторах команд Microsoft (и IBM, и даже моего). Ваша команда for - это составная команда из нескольких строк.

CMD Microsoft отложил расширение переменной, которое по умолчанию не включено, и его необходимо включить (с параметром командной строки /v:on для интерпретатора команд или с помощью параметра EnableDelayedExpansion для команды setlocal в командном сценарии), чтобы бороться с этим:

set A=ONE
set A=TWO & echo !A!

TCC от JP Software берет другую тактику и постепенно расширяет переменные в составных командах, обрабатывая каждую простую команду в составе по мере ее достижения. Поэтому он не раскрывает %A% в предыдущих примерах до тех пор, пока не выполнит вторую команду set .


1 Первым интерпретатором команд, продемонстрировавшим это, если память не изменяет, был cmd в версии 1.0 OS/2, выпущенной в 1987 году. Это был первый интерпретатор команд Microsoft, который поддерживал составные команды.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .