windows - Windows 2018 年 4 月 10 日更新后批次未退出循环
问题描述
我使用批处理脚本连接笔记本电脑上的网络驱动器,因为标准方式(通过驱动器映射)尝试在连接 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 2018 年 4 月 10 日更新后脚本已停止工作。似乎它无法退出循环ping DiskStation | find /i "bytes=" && goto Connected
。
当我在其他命令行窗口中 ping DiskStation 时,该命令的标准结果一切正常。
解决方案
通常for
可以使用 command 退出循环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 /?
推荐阅读
- python - pygame中火速限制器的问题
- python - Python 的 re.findall 似乎在不在函数中时工作,但在函数中时失败
- c++ - 带有结构和数组的 GLSL/C++ std140 布局
- python - 满足条件时不执行第三个 ELIF 语句。在我重新运行代码后执行。Python
- javascript - 我在哪里运行 Jest 中测试设置所需的异步代码?
- ios - 如何从数组中获取 NSManaged Object ID 并将其删除?
- python - 我应该如何自动填充一个字段并在 django 中使其只读?
- sql - SQL Server 中的两个问题
- reactjs - 如何使用reactjs将评论计数分配给帖子
- html - html表单的移动视图响应