首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >.bat脚本,4个列表作为数据,输入是整数i,输出是包含i的列表的排名。

.bat脚本,4个列表作为数据,输入是整数i,输出是包含i的列表的排名。
EN

Stack Overflow用户
提问于 2012-07-02 19:46:50
回答 4查看 500关注 0票数 1

我需要写一个脚本,in.bat

  • 用户输入一个3位数字(作为字符串) i。
  • 脚本有4个预定义的数字组,数字从1到4。
  • 脚本测试组中i的成员资格,并返回包含i的组的索引。

我不熟悉为批处理文件声明和初始化任何类型的数据结构(例如列表、数组等),那么有人能在这方面帮助我吗?

伪码:

代码语言:javascript
复制
::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

谢谢!

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-07-02 23:18:51

批处理没有任何正式的复杂数据结构,如数组、列表或对象。但你可以模仿他们。这里是一个有效的解决方案,它定义了几乎与您的问题一样格式的组。

代码语言:javascript
复制
@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

以上解决方案适用于偶尔调用。但是,如果您要调用这个例程数千次,那么最好用指定的组号初始化一个有效值数组。然后,每个测试都成为对值的直接读取,而不必调用一个例程。然而,滥用这一技术是可能的。分配足够的值,每个变量赋值都会越来越慢。您还可能花费更多的时间来设置数组,而不是实际测试值。

注意,变量名称中的字符[].没有任何意义。它们可以从变量名中删除,并且代码的功能也一样。他们在那里只是为了帮助理解变量的意图。

代码语言:javascript
复制
@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
票数 1
EN

Stack Overflow用户

发布于 2012-07-02 21:47:36

这将将GROUP设置为它在其中找到的代码组。

代码语言:javascript
复制
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

票数 1
EN

Stack Overflow用户

发布于 2012-07-02 21:59:17

不是完美的,而是一个工作的起点。将下面的脚本保存为group.bat,并使用group 878调用它,以找出878属于哪个组。

代码语言:javascript
复制
@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检查第一个参数是否包含在作为第二个参数传递的列表中。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11300185

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档