Цикл
A for
может быть завершен с помощью команды goto
, но не цикл for /L
. Такое непредвиденное поведение можно увидеть в Windows XP или любой более поздней версии Windows, запустив пакетный файл из окна командной строки с помощью только этой командной строки:
@for /L %%A in (1,1,5) do if %%A == 3 @echo EQUAL & goto :EOF
Вывод:
if 1 == 3
if 2 == 3
if 3 == 3
EQUAL
if 4 == 3
if 5 == 3
Команда goto :EOF
не влияет на выполнение. Тем не менее цикл запускается пять раз, хотя на третьей итерации условие if
выполняется и echo
выводит EQUAL
, но goto
не выполняется командным процессором Windows.
В данном случае решение не использует for /L
.
@echo off
setlocal EnableExtensions DisableDelayedExpansion
set "LoopCount=0"
set "SysPath=%SystemRoot%\System32"
%SysPath%\net.exe use * /del /yes >nul
:Loop
%SysPath%\ping.exe -n 1 DiskStation | %SysPath%\find.exe /I "bytes=" >nul 2>&1 && goto Connected
%SysPath%\ping.exe 127.0.0.1 -n 3 >nul
set /A LoopCount+=1
echo %LoopCount%
if not %LoopCount% == 50 goto Loop
%SysPath%\rundll32.exe user32.dll,MessageBeep -1
goto Finish
:Connected
%SysPath%\ping.exe 127.0.0.1 -n 3 >nul
%SysPath%\net.exe use X: \\DiskStation\NaszePhotoVideo /persistent:no
%SysPath%\net.exe use Z: \\DiskStation\NaszeDane /persistent:no
:Finish
endlocal
Цикл, закодированный с меткой перехода, переменной среды, подсчитываемой с использованием арифметического выражения, условием сравнения строк и переходом к метке, выполняется медленнее, чем for /L
, но здесь это не имеет значения для этой задачи.
Чтобы понять используемые команды и то, как они работают, откройте окно командной строки, выполните там следующие команды и полностью прочитайте все страницы справки, отображаемые для каждой команды.
echo /?
endlocal /?
find /?
for /?
goto /?
net /?
net use /?
ping /?
set /?
setlocal /?