dos バッチで区切られた文字列を反復処理する 質問する

dos バッチで区切られた文字列を反復処理する 質問する

個別に処理したい IP の区切りリストがあります。リストの長さは事前にわかりません。リスト内の各項目を分割して処理するにはどうすればよいですか?

@echo off
set servers=127.0.0.1,192.168.0.1,10.100.0.1

FOR /f "tokens=* delims=," %%a IN ("%servers%") DO call :sub %%a

:sub
    echo In subroutine
    echo %1
exit /b

出力:

In subroutine
127.0.0.1
In subroutine
ECHO is off.

アップデート:Franci の回答を参考にして、解決策を以下に示します。

@echo off
set servers=127.0.0.1,192.168.0.1,10.100.0.1

call :parse "%servers%"
goto :end


:parse
setlocal
set list=%1
set list=%list:"=%
FOR /f "tokens=1* delims=," %%a IN ("%list%") DO (
  if not "%%a" == "" call :sub %%a
  if not "%%b" == "" call :parse "%%b"
)
endlocal
exit /b

:sub
setlocal
echo In subroutine
echo %1
endlocal
exit /b

:end

出力:

In subroutine
127.0.0.1
In subroutine
192.168.0.1
In subroutine
10.100.0.1

ベストアンサー1

forコマンドはデフォルトで複数の区切り文字を扱います。この場合、次のようにします。

@echo off

set servers=127.0.0.1,192.168.0.1,10.100.0.1

for %%i in (%servers%) do (
  echo %%i
)

ネイティブにサポートされていない区切り文字に遭遇した場合は、まず置換を実行して文字列を準備し、正しい形式にすることができます。

@echo off

set [email protected]@10.100.0.1
set servers=%servers:@=,%

for %%i in (%servers%) do (
  echo %%i
)

再帰呼び出しを使用すると、リスト内の項目の数が一定数を超えるとスタック領域が不足する可能性があります。また、テストしてみると、再帰パターンの実行速度が少し遅くなるようです。

おすすめ記事