Вы правы, что цикл FOR / L "всегда" считается завершенным.(Ну, на самом деле есть некоторые радикальные методы кодирования, которые могут его сломать, но нет необходимости идти туда)
Однако, хотя цикл считается до конца, предложение DO пропускается после того, как оператор GOTO FOUND былказнены.Вы можете доказать это себе, вставив echo testing %%a&
в начале существующего предложения DO.Как только вы найдете свободный порт, вы увидите, что дополнительное тестирование не проводится.
Цикл FOR / L считает очень быстро (по крайней мере, по пакетным стандартам), поэтому я не буду беспокоиться о дополнительном подсчете.Если бы вы считали от 1 до 1 миллиона, то я бы мог бы волноваться.На 10 миллионов я определенно обеспокоен.
Я могу немного упростить вашу существующую логику.Вы можете объединить 2 оператора FIND в один FINDSTR с помощью регулярного выражения.
for /L %%a in (8000,1,8100) do netstat /a /n | findstr /rc:"%%a.*LISTENING" || set tmp_freeport=%%a && goto found
Я не эксперт по IP-адресам и портам, но меня беспокоит, что ваша логика FIND может оказаться неадекватной для проверки используемыхпорты.Я думаю, что поиск двоеточия до и пробела после порта сделает его более надежным.Кроме того, я сомневаюсь, что вы хотите увидеть текст используемых портов, поэтому я перенаправил вывод FINDSTR на nul.
for /L %%a in (8000,1,8100) do netstat /a /n | findstr /rc:":%%a .*LISTENING" >nul || set tmp_freeport=%%a && goto found
Примечание: GOTO: Метканемедленно прекратит все другие формы цикла FOR.Только вариант FOR / L продолжает считать после GOTO.