shell - Batch ikke spændende Loop efter Windows 10 April 2018 Update

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg bruger batch script til at forbinde netværksdrev på laptop, som standard måde (via drive mapping) forsøger at forbinde dem, før WIFI bliver tilsluttet, derfor er det ikke altid vellykket. Dette script bruges til næsten 3 år uden problemer.


@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: \DiskStationNaszePhotoVideo
net use Z: \DiskStationNaszeDane

:Finish


Script er stoppet for at fungere efter opdatering af Windows 10 april 2018. Synes det kan ikke afslutte sløjfen ved ping DiskStation | find /i "bytes=" && goto Connected.


Når jeg ping DiskStation i andet kommandolinjevindue fungerer det fint med standardresultatet fra kommandoen.

Bedste reference


Et for loop kan udledes generelt med kommando goto, men ikke en for /L loop. Denne forventede adfærd kan ses på Windows XP eller senere Windows ved at køre en batchfil fra et kommandopromptvindue med bare denne kommandolinje:


@for /L \%\%A in (1,1,5) do if \%\%A == 3 @echo EQUAL & goto :EOF


Udgangen er:


if 1 == 3
if 2 == 3
if 3 == 3
EQUAL
if 4 == 3
if 5 == 3


Kommandoen goto :EOF har ingen effekt på udførelsen. Sløjfen køres alligevel fem gange, selvom det på tredje iteration er if betingelsen sand og echo udgange EQUAL, men goto udføres ikke af Windows kommandoprocessor.


En løsning bruger ikke for /L i dette tilfælde.


@echo off
setlocal EnableExtensions DisableDelayedExpansion
set "LoopCount=0"
set "SysPath=\%SystemRoot\%System32"
\%SysPath\%
et.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\%
undll32.exe user32.dll,MessageBeep -1
goto Finish

:Connected
\%SysPath\%ping.exe 127.0.0.1 -n 3 >nul
\%SysPath\%
et.exe use X: \DiskStationNaszePhotoVideo /persistent:no
\%SysPath\%
et.exe use Z: \DiskStationNaszeDane       /persistent:no

:Finish
endlocal


En sløjfe kodet med en hoppetiket, en miljøvariabel optalt ved hjælp af et aritmetisk udtryk, en streng sammenligningsbetingelse og et spring til etiketten er langsommere end for /L, men det betyder ikke noget her på denne opgave.


For at forstå de anvendte kommandoer og hvordan de virker, skal du åbne et kommandopromptvindue, udføre de følgende kommandoer, og læs helt alle hjælpesider, der vises for hver kommando, meget omhyggeligt.



  • echo /?

  • endlocal /?

  • find /?

  • for /?

  • goto /?

  • net /?

  • net use /?

  • ping /?

  • set /?

  • setlocal /?