我需要写一个脚本,in.bat
我不熟悉为批处理文件声明和初始化任何类型的数据结构(例如列表、数组等),那么有人能在这方面帮助我吗?
伪码:
::Returns 1,2,3,4,5 Depending on testNum passed
group1= <822-824,829,845,851,859,864,867>
group2= <826-828,830-839,843-844,847-850,852-854,860-862,883>
group3= <855-858,861,863,865>
group4= <877-882,884>
if %1 is member of group1
return 1
if %1 is member of group2
return 2
if %1 is member of group3
return 3
if %1 is member of group4
return 4谢谢!
发布于 2012-07-02 23:18:51
批处理没有任何正式的复杂数据结构,如数组、列表或对象。但你可以模仿他们。这里是一个有效的解决方案,它定义了几乎与您的问题一样格式的组。
@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发布于 2012-07-02 21:47:36
这将将GROUP设置为它在其中找到的代码组。
set test=822,823,824,829,845,851,859,864,867
echo %test% | findstr %1>nul&&set group=1
set test=826,827,828,830,831,832,833,834,835,836,837,838,839,843,844,847,848,849,850,852,853,854,860,861,862,883
echo %test% | findstr %1>nul&&set group=2
set test=855,856,857,858,861,863,865
echo %test% | findstr %1>nul&&set group=3
set test=877,878,879,880,881,882,884
echo %test% | findstr %1>nul&&set group=4如果要使用ERRORLEVEL测试返回值,则将SET GROUP=更改为EXIT /B
发布于 2012-07-02 21:59:17
不是完美的,而是一个工作的起点。将下面的脚本保存为group.bat,并使用group 878调用它,以找出878属于哪个组。
@echo off
SET group1=822-824,829,845,851,859,864,867
SET group2=826-828,830-839,843-844,847-850,852-854,860-862,883
SET group3=855-858,861,863,865
SET group4=877-882,884
CALL :IsInGroup %1 "%group1%"
IF Errorlevel 1 echo Group 1 & GOTO :EOF
CALL :IsInGroup %1 "%group2%"
IF Errorlevel 1 echo Group 2 & GOTO :EOF
CALL :IsInGroup %1 "%group3%"
IF Errorlevel 1 echo Group 3 & GOTO :EOF
CALL :IsInGroup %1 "%group4%"
IF Errorlevel 1 echo Group 4 & GOTO :EOF
echo Group not found
GOTO :EOF
:IsInGroup
SETLOCAL ENABLEDELAYEDEXPANSION
FOR %%i IN (%~2) DO (
SET h=%%i
SET g=!h:~3,1!
SET /a lo=!h:~0,3!
IF !g!. == -. (
SET /a hi=!h:~4,3!
IF %1 GEQ !lo! (
IF %1 LEQ !hi! exit /B 1
)
) ELSE (
IF %1 EQU !lo! exit /B 1
)
)
ENDLOCAL
EXIT /B 0函数:IsInGroup检查第一个参数是否包含在作为第二个参数传递的列表中。
https://stackoverflow.com/questions/11300185
复制相似问题