如何使用大量ifs简化批处理

时间:2019-04-08 14:33:09

标签: batch-file cmd

是否有任何方法可以简化此代码并使之仍可继续运行?

set /a food=%random% %% 6 + 1
if %food%==1 (set foodtype=bread)
if %food%==2 (set foodtype=apple)
if %food%==3 (set foodtype=steak)
if %food%==4 (set foodtype=banana)

我不知道很多批次,但是我期望与此类似:

set /a food=%random% %% 6 + 1
 if food = (1, 2, 3, 4) (set foodtype bread, apple, steak, banana)

5 个答案:

答案 0 :(得分:3)

或者,您也可以使用列表:

associatedUsers

(优点:您可以在不修改代码的情况下(例如在游戏过程中)“即时”修改列表(删除或添加项目)

答案 1 :(得分:2)

您可以使用伪数组(因为不真正支持数组)。

setlocal EnableDelayedExpansion
set "arr_foodtype[0]=bread"
set "arr_foodtype[1]=apple"
set "arr_foodtype[2]=steak"
set "arr_foodtype[3]=banana"

set /a food=%random% %% 4

set "foodtype=!arr_foodtype[%food%]!"

答案 2 :(得分:2)

另一种较短的方法:

@echo off
setlocal EnableDelayedExpansion
set "foodList=bread apple steak banana "

set /A food=%random% %% 4

set "this=%foodList: =" & (if !food! equ 0 set "foodtype=!this!") & set /A "food-=1" & set "this=%"

echo %foodtype%

此解决方案使用与LotPing答案中所示的相同的自扩展代码方法...

答案 3 :(得分:1)

Stephan回答的类似方法,将列表转换为数组, 但使用某种自扩展代码。

:: Q:\Test\2019\04\08\SO_55575835.cmd
@Echo off&SetLocal EnableDelayedExpansion

Set i=0&Set "foodtypes= bread apple steak banana"
Set "foodtypes=%foodtypes: ="&Set /a i+=1&Set "foodtypes[!i!]=%"

set /a food=%random% %% %i% + 1
set "foodtype=!foodtypes[%food%]!"

set food

示例输出:

>  SO_55575835.cmd
food=2
foodtype=apple
foodtypes[1]=bread
foodtypes[2]=apple
foodtypes[3]=steak
foodtypes[4]=banana

答案 4 :(得分:0)

关于多行字符串方法(代码中的空行是必需的)呢?

@echo off
set /A "FOOD=%RANDOM%%%4+1"
for /F "tokens=1*" %%I in (^"
1 bread^

2 apple^

3 steak^

4 banana^

^") do if %%I equ %FOOD% set "FOODTYPE=%%J"
echo %FOOD%: %FOODTYPE%

示例输出:

2: apple

顺便说一下,set /a food=%random% %% 6 + 1将一个值从1分配给 6