1

バッチファイルで簡単な操作を試みています。トークンを反復処理し、トークンごとにいくつかのタスクを実行します。

次のスクリプトが再帰ループになり、最初のトークンを常に反復する理由を誰かが指摘できますか?

@echo off
set servers=10.20.30.40,200.300.400.500
echo %servers%
Call :configureDataStore "%servers%"
goto :eos
:configureDataStore
set list=%servers%
set list=%list:"=%
FOR /f "tokens=1* delims=," %%a IN ("%list%") DO (
  if not "%%a" == "" call :configureSlave %%a  
  if not "%%b" == "" (
     set servers = %%b
     call :configureDataStore "%%b"
  )
)
goto :eos
:configureSlave
   echo In subroutine %1
   goto :eos

:eos
4

2 に答える 2

4

非常に単純な論理エラーがあります。1 つのパラメーターで呼び出し:configureDataStoreますが、ルーチン内で(パラメーター)%servers%を使用する必要があるときに (定数)を参照します。%1

実際には%~1、囲んでいる引用符を削除したい場合に使用する必要があります。

を使用する代わりに、 を使用goto :eosする必要がありますgoto :eof。すべてのスクリプトの最後には常に暗黙の:eofラベルがあるため、ファイルの最後に物理的に配置する必要はありません:eof

私が好むより現代的なバージョンはexit /bで、これは とまったく同じことを行いgoto :eofます。の利点はexit /b、必要に応じて ERRORLEVEL を設定できることですexit /b 1

「サブルーチン」のような一般的な単語を使用するのではなく%0、現在実行中のサブルーチンの名前を取得するために使用できます。%*渡されたすべてのパラメーターを取得するために使用できます(%1この場合と違いはありません)

現在書かれているように、必要以上の変数を使用しています。しかし、これは明らかに未完成のコードであり、あなたがどこでそれを使用するのかわかりません。そのため、変数の使用法は変更しませんでした。

@echo off
set servers=10.20.30.40,200.300.400.500
echo %servers%
Call :configureDataStore "%servers%"
exit /b

:configureDataStore
set "list=%~1"
FOR /f "tokens=1* delims=," %%a IN ("%list%") DO (
  if not "%%a" == "" call :configureSlave %%a
  if not "%%b" == "" (
     set servers = %%b
     call :configureDataStore "%%b"
  )
)
exit /b

:configureSlave
echo In %0 %*
exit /b
于 2013-09-07T13:26:31.437 に答える
0

あなたがやろうとしていることを理解していれば、あなたの問題はこの行にあります(これは非常に過剰に設計されています)

 set servers = %%b

スペースを使用して変数「%servers %」を作成していたので、そのようにスペースを削除します。

 set servers=%%b
于 2013-09-07T22:09:34.960 に答える