Batch file 设置为从预设类别中拾取随机文件的批处理文件不是拾取随机文件(继续拾取最后一个文件!)

Batch file 设置为从预设类别中拾取随机文件的批处理文件不是拾取随机文件(继续拾取最后一个文件!),batch-file,random,Batch File,Random,晚上好。我喜欢在我的空闲时间修改游戏,这是一个游戏,其中个人修改被打包成zip文件,并通过简单地将所述拉链放入特定文件夹加载。我有数百个这样的拉链,我希望做一个批次,每次我使用它时都能为我挑选一个随机的模子,而不是自己去挑选,同时把所有未使用的都放在一个禁用的文件夹中,这样我就可以把所有未使用的东西都放在一个地方。每个mod都有一个前缀,表示它属于什么类别,例如“武器”\u猎枪”\u Giantagrygun9000.zip”或“角色”\u huck\u小丑.zip” 这个批处理脚本的工作原理是

晚上好。我喜欢在我的空闲时间修改游戏,这是一个游戏,其中个人修改被打包成zip文件,并通过简单地将所述拉链放入特定文件夹加载。我有数百个这样的拉链,我希望做一个批次,每次我使用它时都能为我挑选一个随机的模子,而不是自己去挑选,同时把所有未使用的都放在一个禁用的文件夹中,这样我就可以把所有未使用的东西都放在一个地方。每个mod都有一个前缀,表示它属于什么类别,例如“武器”\u猎枪”\u Giantagrygun9000.zip”或“角色”\u huck\u小丑.zip”

这个批处理脚本的工作原理是:首先,它将获取mod文件夹中当前具有指定前缀的每个文件,并将它们全部放入disabled文件夹中。然后,它将遍历禁用文件夹中具有所有指定前缀的每个文件,从每个类别中随机选择一个文件,并将它们移动到mod文件夹中。目前,我已经让我的批处理完成了所有解释的工作,除了从每个前缀列表中随机挑选之外,它一直从每个前缀列表中按字母顺序挑选最后一个。我相信这是因为用于为文件数组中的条目指定索引的Num var没有被修改或读取,尽管我尽了最大的努力,但我无法让它按我希望的方式工作

任何建议或解决方案都将不胜感激,感谢您的阅读

setlocal EnableDelayedExpansion

SET modFolder="C:\Game\Mods\"
SET disabledFolder="C:\Game\Mods\Disabled\"
SET itemListIndex=0

::Prefix names
SET Prefix1=Weapon_Shotgun_
set itemList[%itemListIndex%]=%Prefix1%
set /A itemListIndex+=1

SET Prefix2=Character_ThisPerson_
set itemList[%itemListIndex%]=%Prefix2%
set /A itemListIndex+=1

SET Prefix3=Weapon_Rifle_
set itemList[%itemListIndex%]=%Prefix3%
set /A itemListIndex+=1


for /l %%G in (0 1 %itemListIndex%) do (
    if not "!itemList[%%G]!" == "" (
        set num=0
        for %%f in (!itemList[%%G]!*.zip) do (
           set /A num+=1
           set file[%num%]=%%f
        )
        set /A pick = !random! * %num% / 32768 + 1
        echo Moving "!file[%pick%]!" to the mod folder
        move "%disabledFolder%!file[%pick%]!" %modFolder%
    )
)
设置文件[%num%]=%%f
作为
设置文件[]='[文件名]'
而不是预期的
设置文件[''(索引号)]='[文件名]'

书面回音说
移动!文件[]!转到mod文件夹
,而不是预期的
移动(文件名)到mod文件夹

拾取变量echos为空,表示num或random无效

@ECHO OFF
setlocal EnableDelayedExpansion
SET modFolder=“C:\Game\Mods\”
SET disabledFolder=“C:\Game\Mods\Disabled\”
设置itemListIndex=0
::前缀名称
SET Prefix1=武器\猎枪_
设置项目列表[%itemListIndex%]=%Prefix1%
set/A itemListIndex+=1
SET Prefix2=字符\此人_
设置项目列表[%itemListIndex%]=%Prefix2%
set/A itemListIndex+=1
SET Prefix3=武器\步枪_
设置项目列表[%itemListIndex%]=%Prefix3%
set/A itemListIndex+=1
对于/l%%G in(0.1%itemListIndex%)do(
如果不是“!itemList[%%G]!”==“”(
set num=0
对于(!itemList[%%G]!*.zip)中的%%f,请执行以下操作(
set/A num+=1
设置文件[!num!]=%%f
)
set/A pick=!random!*!num!/32768+1
调用集“PICKFILE=%%file[!pick!]%%”
REM echo正在将“!文件[%pick%]!”移动到mod文件夹
REM回显移动“%disabledFolder%”!文件[%pick%]!%modFolder%
echo将“!pickfile!”移动到mod文件夹
回显移动“%disabledFolder%”!pickfile!”%modFolder%
)
)
后藤:EOF
您的问题是
%num%
%pick%
是解析外部循环(%%G)时
num
和``pick`的值,也就是说,没有

经典的方法是使用
!嗯用于运行时值,但您使用的是间接寻址,因此您可能会尝试使用
!文件[!拾取!]不明确,解析为
拾取
调用
使用子shell来解决歧义


Move
命令被
echo
ed解除武装。

尽管已经收到并接受了答复,我还是决定发布此消息,向您展示我将如何执行此操作

@Echo关闭
SetLocal EnableDelayedExpansion
设置“modFolder=C:\Game\Mods”
设置“disabledFolder=C:\Game\Mods\Disabled”
Rem未定义现有变量
对于/F“Delims=”('Set item 2^>NUL')中的%%A,请设置“%%A=”
Rem定义文件名前缀
设置“itemListIndex=0”
对于%%A In(
猎枪
这个人的性格
步枪
)Do(设置/A itemListIndex+=1
设置“itemList[!itemListIndex!]=%%A”
Rem随机化项目列表索引
Set/A itemListIndex=(%RANDOM%%%itemListIndex)+1
Rem基于itemList[%itemListIndex%]定义文件
设置“itemFileIndex=0”
对于(“!itemList[%itemListIndex%]!*.zip”)中的%%A,执行(设置/A itemFileIndex+=1
设置“itemFile[!itemFileIndex!]=%%A”)
Rem随机化itemFileIndex
Set/A itemFileIndex=(%RANDOM%%%itemFileIndex)+1
Rem将itemFile[%itemFileIndex%]移动到modFolder。
将“!itemFile[%itemFileIndex%]!”回送到mod文件夹
移动/Y“%disabledFolder%\!itemFile[%itemFileIndex%]!”“%modFolder%”
暂停
通过这种方式,您可以很容易地附加到带括号的前缀列表中(这大大减少了代码并使维护更简单)。首先将
itemListIndex
随机化也更有意义,以减少返回的
.zip
文件的数量以供选择/移动