在Windows批处理文件中设置随机数组

时间:2014-05-14 03:24:12

标签: windows batch-file random

我正在尝试设置一个批处理文件,通过Steam Achievement Manager一次启动10个Steam游戏。这是我正在使用的当前脚本(包括超过10个):

@echo off
echo Launching Steam games...
start sam.game.exe 233720
start sam.game.exe 113200
start sam.game.exe 219640
start sam.game.exe 2500
start sam.game.exe 204300
start sam.game.exe 49600
start sam.game.exe 107100
start sam.game.exe 730
start sam.game.exe 550
start sam.game.exe 35700
start sam.game.exe 92300
start sam.game.exe 217690
start sam.game.exe 620
start sam.game.exe 8930
start sam.game.exe 57690
start sam.game.exe 24240
start sam.game.exe 3830
start sam.game.exe 35140
start sam.game.exe 200260
start sam.game.exe 4920
start sam.game.exe 245070
start sam.game.exe 204360
start sam.game.exe 46750
start sam.game.exe 300
start sam.game.exe 18500
start sam.game.exe 63800
start sam.game.exe 214340
start sam.game.exe 25800
start sam.game.exe 8500
start sam.game.exe 212680
start sam.game.exe 4000
start sam.game.exe 41800
start sam.game.exe 220
start sam.game.exe 25890
start sam.game.exe 219150
start sam.game.exe 1250
start sam.game.exe 42170
start sam.game.exe 202090
start sam.game.exe 220860
start sam.game.exe 4700
start sam.game.exe 32200
start sam.game.exe 22100
start sam.game.exe 39800
start sam.game.exe 91900
start sam.game.exe 40300
start sam.game.exe 4760
start sam.game.exe 45100
start sam.game.exe 11200
start sam.game.exe 107200
start sam.game.exe 99900
start sam.game.exe 440
start sam.game.exe 105600
start sam.game.exe 207610
start sam.game.exe 206440
start sam.game.exe 24010
start sam.game.exe 46540
start sam.game.exe 13230
start sam.game.exe 42960
pause

您看到的数字是Steam游戏ID。基本上,我希望能够创建一个数组,其中包含我拥有的所有Steam游戏ID,以及随机选择其中10个(非重复)并且仅启动这些10的脚本。我很新批处理文件,所以我遇到了很多麻烦。

3 个答案:

答案 0 :(得分:0)

@ECHO OFF
SETLOCAL enabledelayedexpansion
:: remove variables starting $
FOR  /F "delims==" %%a In ('set $ 2^>Nul') DO SET "%%a="

FOR /f "tokens=1,2delims=[]" %%a IN ('type q23645114.txt^|find /n /v "" ') DO SET $%%a=%%b&SET max=%%a

SET /a games=5

:choose
SET /a index=(%RANDOM% %% %max%) + 1
IF NOT DEFINED $%index% GOTO choose
ECHO START sam.game.exe !$%index%!
SET "$%index%="
SET /a games-=1
IF %games% gtr 0 GOTO choose

GOTO :EOF

您不会说出您获取游戏号码的位置,因此我使用了包含此数据的q23645114.txt文件进行测试。

63800
214340
25800
8500
212680
4000
41800
220
25890
219150

此例程的第一件事就是清除任何以$

开头的变量

然后它会读取文件q23645114.txt并使用find将其转换为     [1] 63800     [2] 214340     ...

/n安装[编号],/v ""说'查找所有不包含任何内容的行')

然后,使用[]作为分隔符,将1分配给第一个元变量 %%a63800第二个,%%b。然后将$1设置为63800,依此类推整个文件。它还跟踪max

中的最大数量(=行数)

然后设置游戏数量(测试时为5 - 您选择任何其他值......)

然后通过调用modulus运算符%%来选择随机数0 ..(max-1) - 并添加一个

查看$ thatindex是否已设置。如果不是,请再次选择。

如果已设置,则启动 游戏编号,清除阵列中的游戏编号,计算一个游戏开始并再次选择,直到所需的编号已经开始。

(仅供echo代码start用于测试目的。 - 在验证实际开始游戏后,将echo start更改为start

答案 1 :(得分:0)

@echo off
setlocal EnableDelayedExpansion

rem You may define next value from a parameter, if you wish
set number=10

rem Define the array of game ID's
set n=0
for %%a in (233720 113200 219640 2500 204300 49600 107100 730   550    35700
            92300  217690 620    8930 57690  24240 3830   35140 200260 4920
            245070 204360 46750  300  18500  63800 214340 25800 8500   212680
            4000   41800  220
           ) do (
   set /A n+=1
   set gameID[!n!]=%%a
)

rem Select %number% non-duplicated random elements from previous array and run such Steam games
for /L %%n in (1,1,%number%) do (
   rem Get the index of a random element
   call :getRandomElem i=
   rem Run such game
   for /F %%i in ("!i!") do start sam.game.exe !gameID[%%i]!
   rem Put a zero in such element
   set gameID[!i!]=0
)

goto :EOF


rem Get the index of a random element greater than 0 from gameID array
:getRandomElem i=
set /A i = n * %random% / 32768 + 1
if !gameID[%i%]! equ 0 goto getRandomElem
exit /B

您可以在this post的批处理文件中查看有关阵列管理的详细说明。

答案 2 :(得分:0)

这是另一种方式并使用Setlocal =

Setlocal

@echo off
set x0=Hello
set x1=World
set x2=James
set x3=Cake
set /a rand=%random% %% 4
echo Random = %rand%
setlocal enabledelayedexpansion
echo !x%rand%!
endlocal