batch-file - 设置为从预设类别中选择随机文件的批处理文件未选择随机文件(继续选择最后一个文件!)
问题描述
晚上好。我喜欢在空闲时间修改游戏,这是一款将单个模组打包成 zip 文件并通过简单地将所述 zip 文件放入某个文件夹来加载的游戏。我有数百个这样的 zip 并且希望制作一个批次,每次我使用它时都会为我挑选一个随机的 mod,而不必自己挑选它们,同时将所有未使用的拉链放入我制作的禁用文件夹中将所有不被使用的东西都放在一个地方。每个模组都有一个名称前缀,表示它所属的类别,例如“weapon_shotgun_GiantAngryGun9000.zip”或“character_huck_Clown.zip”
这个批处理脚本的工作原理是,首先它会获取当前在 mod 文件夹中具有指定前缀的每个文件,并将它们全部放入禁用的文件夹中。然后它会遍历禁用文件夹中具有所有指定前缀的每个文件,从每个类别中选择一个随机文件,并将它们移动到 mod 文件夹中。目前,我已经让我的批次完成所有解释,除了不是随机选择每个,而是从每个前缀列表中选择按字母顺序排列的最后一个。我相信这是因为用于指定 File 数组中条目的索引的 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%
)
)
set file[%num%]=%%f
被回显为set file[]='[name of file]'
而不是预期set file['(index number)']='[name of file]'
书面回声说Moving !file[]! to the mod folder
而不是预期Moving (name of file) to the mod folder
选择变量回显为空白,表示 num 或 random 无效
解决方案
@ECHO OFF
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
CALL SET "PICKFILE=%%file[!pick!]%%"
REM echo Moving "!file[%pick%]!" to the mod folder
REM ECHO move "%disabledFolder%!file[%pick%]!" %modFolder%
echo Moving "!pickfile!" to the mod folder
ECHO move "%disabledFolder%!pickfile!" %modFolder%
)
)
GOTO :EOF
你的问题是,当解析外循环(%%G)时, %num%
and是和``pick`%pick%
的值,也就是说, nothing。num
经典方法是!num!
用于运行时值,但您使用的是间接方式,因此您很想使用!file[!pick!]!
它是模棱两可的并解析为pick
. call
使用 subshell 来解决歧义。
Move
命令被echo
ed 解除武装。
推荐阅读
- javascript - 在js中从RGBA获取十六进制
- pdf - PDF 文件结构:HTML 代码的用途是什么?
- python - TensorFlow 1.x:TypeError:不支持的操作数类型/:'NoneType'和'int'
- sql-server - 如果我继续删除行,IDENTITY 会溢出吗?
- python - Opencv python车道检测绘制线使用cv2.line()更改线颜色错误未成功
- sql-server - 将十六进制字符串转换为整数的样式
- angularjs - 导出 pdf 适用于除 Internet Explorer 11 以外的所有浏览器,角度为 5
- c++ - 当返回类型是模板类的内部类时,为什么在模板声明和返回类型之间需要`typename`?
- web - OAuth2.0 和 OpenID 良好实践
- elasticsearch - Filebeat 添加不需要的空白字段