在Windows 10 April 2018 Update之后批量不退出循环

时间:2018-05-05 22:19:20

标签: windows shell batch-file command-line

我使用批处理脚本连接笔记本电脑上的网络驱动器,因为标准方式(通过驱动器映射)尝试在连接WIFI之前连接它们,因此并不总是成功。这个脚本过去几乎没有任何问题。

@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 April 2018 Update之后,脚本已停止工作。似乎它无法在ping DiskStation | find /i "bytes=" && goto Connected退出循环。

当我在其他命令行窗口中ping DiskStation时,一切正常,并且该命令的标准结果。

1 个答案:

答案 0 :(得分:1)

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,但循环仍然运行五次,但Windows命令处理器不执行goto

在这种情况下,解决方案不使用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 /?