FOR/Lループは「常に」完了までカウントされるというのは正しいことです。(まあ、実際にはそれを壊すことができるいくつかの抜本的なコーディング方法がありますが、そこに行く必要はありません)
ただし、ループは完了までカウントされますが、GOTO FOUNDステートメントが実行されると、DO句はスキップされます。echo testing %%a&
これは、既存のDO句の前に挿入することで証明できます。空きポートを見つけたら、追加のテストは行われないことがわかります。
FOR / Lループは(少なくともバッチ標準では)非常に高速にカウントされるため、余分なカウントについて心配する必要はありません。今、あなたが100万から100万を数えているなら、私は心配するかもしれません。1000万で私は間違いなく心配しています。
既存のロジックを少し単純化できます。正規表現を使用して、2つのFINDステートメントを1つの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:Labelは、他のすべての形式のFORループをすぐに終了します。FOR / Lバリアントのみが、GOTOの後にカウントを継続します。