Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows 2018年4月10日更新后批处理未退出循环_Windows_Shell_Batch File_Command Line - Fatal编程技术网

Windows 2018年4月10日更新后批处理未退出循环

Windows 2018年4月10日更新后批处理未退出循环,windows,shell,batch-file,command-line,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 -

我使用批处理脚本连接笔记本电脑上的网络驱动器,因为标准方法(通过驱动器映射)试图在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 2018年4月10日更新后,脚本已停止工作。似乎无法在ping DiskStation | find/i“bytes=“&&goto Connected处退出循环


当我在其他命令行窗口中ping DiskStation时,所有操作都可以正常进行,并且命令的标准结果都是正确的。

A
for
循环通常可以通过命令
goto
退出,但/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
使用跳转标签编码的循环、使用算术表达式计数的环境变量、字符串比较条件和跳转到标签的速度比/L的
慢,但在本任务中这并不重要

要了解所使用的命令及其工作方式,请打开命令提示符窗口,在其中执行以下命令,并非常仔细地阅读为每个命令显示的所有帮助页面

  • echo/?
  • endlocal/?
  • 查找/?
  • 获取/?
  • goto/?
  • net/?
  • 网络使用/?
  • ping/?
  • 设置/?
  • setlocal/?

我还注意到,Ping现在要求主机名小写,即使在Synology上设置为“DiskStation”。Net.exe仍然接受正确的PascalCase名称,因为它是真正命名的。