バッチには、配列、リスト、オブジェクトなどの正式な複雑なデータ構造はありません。しかし、それらをエミュレートすることはできます。これは、質問のような形式でグループを定義する効率的なソリューションです。
@echo off
setlocal enableDelayedExpansion
::Here is a small loop to test the routine
for %%N in (822,823,883,835,856,863,880,884) do (
call :assignGroup %%N
echo %%N is in group !group!
)
exit /b
:assignGroup CaseNumber
:: The returning value is contained in variable GROUP
set group=0
for %%A in (
"822-824,829,845,851,859,864,867"
"826-828,830-839,843-844,847-850,852-854,860-862,883"
"855-858,861,863,865"
"877-882,884"
) do (
set /a group+=1
for %%B in (%%~A) do (
for /f "tokens=1,2 delims=-" %%C in ("%%B") do (
if "%%C"=="%~1" exit /b
if "%~1" gtr "%%C" if "%~1" leq "%%D" exit /b
)
)
)
::no group found so undefine the var
set "group="
exit /b
上記の解決策は、たまに電話をかける場合に適しています。ただし、ルーチンを何千回も呼び出す場合は、割り当てられたグループ番号を使用して有効な値の配列を初期化することをお勧めします。次に、各テストは、ルーチンを呼び出す代わりに、値の直接読み取りになります。ただし、この手法を悪用することは可能です。十分な値を割り当てると、各変数の割り当てがどんどん遅くなります。また、実際に値をテストするよりも、配列の設定に多くの時間を費やす可能性があります。
[].
変数名の文字には意味がないことに注意してください。それらは変数名から取り除くことができ、コードは同じように機能します。それらは、変数の意図を理解するのを助けるためだけにあります。
@echo off
setlocal enableDelayedExpansion
::initialize a sparse "array" that assigns a group to each valid case #
set group=0
for %%A in (
"822-824,829,845,851,859,864,867"
"826-828,830-839,843-844,847-850,852-854,860-862,883"
"855-858,861,863,865"
"877-882,884"
) do (
set /a group+=1
for %%B in (%%~A) do (
for /f "tokens=1,2 delims=-" %%C in ("%%B") do (
if "%%D"=="" (
set case[%%C].group=!group!
) else for /l %%N in (%%C 1 %%D) do (
set case[%%N].group=!group!
)
)
)
)
::Now test some values
for %%N in (822,823,883,835,856,863,880,884,900) do (
if defined case[%%N].group (
echo %%N is in !case[%%N].group!
) else (
echo %%N is not in a group
)
)
exit /b