Пакет не выходит из цикла после обновления Windows 10 апреля 2018 - PullRequest
0 голосов
/ 06 мая 2018

Я использую пакетный сценарий для подключения сетевых дисков на ноутбуке, так как стандартный способ (через сопоставление дисков) пытается подключить их до подключения WIFI, поэтому не всегда удается. Этот скрипт работал почти последние 3 года без проблем.

@echo off
net use * /del /yes
net use /persistent:no

:Loop
for /L %%A in (1,1,50) do (
ping DiskStation | find /i "bytes=" && goto Connected
ping LocalHost -n 3 > nul
ECHO %%A
)
rundll32 user32.dll,MessageBeep -1
goto Finish

:Connected
ping LocalHost -n 3 > nul
net use X: \\DiskStation\NaszePhotoVideo
net use Z: \\DiskStation\NaszeDane

:Finish

Скрипт перестал работать после обновления Windows 10 апреля 2018 года. Кажется, он не может выйти из цикла в ping DiskStation | find /i "bytes=" && goto Connected.

Когда я пингую DiskStation в другом окне командной строки, все работает нормально со стандартным результатом команды.

1 Ответ

0 голосов
/ 07 мая 2018
Цикл

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 /?
...