如何防止批量跳过某些FOR循环?

时间:2018-01-07 03:32:14

标签: windows batch-file for-loop cmd ini

我目前正在批量处理休闲游戏,在恢复保存数据时我遇到了一个小问题。

所有保存数据都存储在自定义INI文件中(第四个答案here的想法,第一个答案的其他代码here)。当用户输入保存名称时,首先创建INI文件,并将所述名称设置为名为savename的变量。通过type sdata.txt > saves\%savename%.ini复制模板sdata.text时生成INI文件。

然后将用户加载先前保存文件时使用的变量loadsave设置为savename(set loadsave=%savename%)。然后该文件调用一个名为lsdata.bat的单独文件,lsdata.bat从INI文件中获取值并将它们指定为变量以供游戏使用。

INI文件的一个例子是:

[GameData]
lastfile=expo
lastsection=INTROGAME
nextsection=SECTWO
[PlayerData]
held=none
name=none
lname=none`

和lsdata.bat看起来像

for /f "delims=" %%a in ('call get.bat saves\%loadsave%.ini GameData lastfile') do (
    set lastfile=%%a
    echo setting var lastfile...
)

for /f "delims=" %%a in ('call get.bat saves\%loadsave%.ini GameData lastsection') do (
    set lastsection=%%a
    echo setting var lastsection...
)

for /f "delims=" %%a in ('call get.bat saves\%loadsave%.ini GameData nextsection') do (
    set nextsection=%%a
    echo setting var nextsection...
)

等等。文件get.bat与我在那里提到的第二个链接中的ini.bat完全相同。

调用修改后的保存文件时会出现问题。在创建新的保存时,会调用lsdata.bat并且一切都运行顺畅(我可以从回显的文本行中看出,这有助于我确认FOR循环已完成)。但是,当使用修改后的保存文件,其中所有值都不是默认值时,将跳过所有FOR循环,文件将跳至ECHO和底部的CECHO。

如果在游戏有机会覆盖某些值之前创建并退出了保存文件,则所有内容都将按原样恢复。但是,即使一个值已被更改,它也会跳过所有FOR循环,并且变量都等于NUL。当游戏首次加载时,所有变量都设置为NUL用于测试目的,然后可以在创建新保存或加载旧保存时重新分配值。

延迟扩展已启用,如果您尝试调用变量(使用!或%),它仍然会将它们设置为等于NUL。

如何防止修改后的文件导致这个奇怪的错误?

0 个答案:

没有答案