我在 launcher.bat 服务器命令行变量中有一个 mod 列表,用分号分隔:
set Antistasi2=-mod=%ModPath%@CBA_A3;%ModPath%@Antistasi;%ModPath%@CAC_AE1.4;%ModPath%@AWR;%ModPath%@RealEngine;%ModPath%@ace;%ModPath%@EnhancedMovement;%ModPath%@EnhancedMovementRework;%ModPath%@MfHealAbort;%ModPath%@VET_Unflipping;%ModPath%@AdvancedRappelling;%ModPath%@AdvancedUrbanRappelling;%ModPath%@Blastcore`
我有一个简单的模组检查器(从 launcher.bat 中调用的 modchecker.bat,检查具有预定义模组名称的现有文件夹并键入缺少的模组文件夹名称 (mods):
if not exist %ModPath%"@CBA_A3" echo @CBA_A3 NOT FOUND
if not exist %ModPath%"@Antistasi" echo @Antistasi NOT FOUND
...
if not exist %ModPath%"@Blastcore" echo @Blastcore NOT FOUND
但是预定义的mod文件夹名称比命令行中当前使用的mod更多。
我想要的不是使用预定义的模组文件夹列表,而是使用命令行来填充模组检查器并在模组检查器中为命令行中使用的每个模组创建
if not exist %ModPath%"@modxxx" echo @modxxx NOT FOUND
行。
换句话说,我需要从命令行数组中获取 mod 文件夹名称(
-Mod=
在 %Antistasi2%
变量中(它们是:@CBA_A3、@Antistasi 等,一直到@Blastcore)并将它们自动集成到模组检查器中,以便命令行中的模组列表自动填充模组检查器中缺少的模组搜索,因此不必手动预定义。
我不知道该怎么做。请帮助。
提前致谢。
@ECHO OFF
SETLOCAL
SET "ModPath=q:\somewhere\or\other\"
SET "list= %* CBA_A3 Antistasi CAC_AE1.4 AWR RealEngine ace EnhancedMovement EnhancedMovementRework MfHealAbort VET_Unflipping AdvancedRappelling AdvancedUrbanRappelling Blastcore"
SET "missing="
FOR %%e IN (%list%) DO IF NOT EXIST %ModPath%@%%e ECHO %%e missing&SET "missing=y"
rem IF DEFINED missing pause&GOTO :eof
SET "list=%list: = %"
CALL SET "Antistasi2=%%list: =;%ModPath%@%%"
SET "Antistasi2=-mod=%Antistasi2:~1%"
SET anti
GOTO :EOF
我假设集合 {CBA_A3..Blastcore} 将始终是必需的,并且可能会指定一些额外的模块,所以
thisbatch extra something hello
会在这些标准项目中添加
extra
、something
和 hello
。
我还假设所需的每个模块都以
@
为前缀。
我已经建立了一个虚拟的
modpath
用于测试。你需要改变这个。
list
将命令行中的参数添加到标准列表中。请注意,前导空格很重要。
我已经说明了如果缺少一个模块会发生什么。只需删除
rem
即可激活 pause
和 goto :eof
(如果激活,应该做饭并终止批次)
下一步。将
list
中的所有双空格替换为单个空格。
接下来,将
list
中的所有空格替换为;%modpath%@
(注意会替换modpath
的值)并赋值给Antistasi2
然后去掉
Antistasi2
的第一个字符,加上-mod=
前缀
注意:使用
set "var=value"
设置字符串值 - 这避免了由尾随空格引起的问题。不要分配 "
或终端反斜杠或空格。从元素构建路径名——与直觉相反,这可能会使过程更容易。如果使用语法set var="value"
,则引号成为分配值的一部分。
如果按照建议删除
\
,则需要在@
语句和if not exist
语句中的call set
之前插入它。