使用 .bat 编码从 .sav 文件分段保存和加载
Save and load from .sav files in sections with .bat coding
我正在批量制作一个包含大量数据值的程序。我需要分块加载它们,但我最终可能会将它们全部保存在一起。如果我使用这种格式将值加载到 .sav 文件,我将如何从特定组加载它们?
(
echo "[playerdata]"
echo playername=%playername%
echo playerlevel=%playerlevel%
echo "[inventory]"
echo playerslotone=%playerslotone%
echo plrslot1amnt=%plrslot1amnt%
) > savegame.sav
我可能需要从 [player data] 和 [inventory] 中删除报价 headers。这只是一个例子,会有更多的价值和更多的细分市场。
我需要从一个段中加载一个精确的值,就像你从 ini 中加载一样。(但不是从 InI 中)
Technoguyfication 在他对 [Save and Load .bat game] 的回应中的 ini 文件中使用了这种格式。感谢任何帮助。我是一个重度初学者,所以请考虑一下。
如果这似乎是重复的,我很抱歉。它不应该,因为我正在从 .sav 文件加载和保存,并使用新路径而不是仅使用命令。 Compo 的回应在这种情况下非常有帮助。我可能是错的,因为我说我是一个严重的初学者。
非常抱歉,谢谢。
当然建议删除那些包含部分名称的双引号。
您甚至可以使 .sav
文件看起来更漂亮,通过使用 TABs 和 s ,如果你愿意,例如
(
Echo [PlayerData]
Echo PlayerName = %PlayerName%
Echo PlayerLevel = %PlayerLevel%
Echo=
Echo [Inventory]
Echo PlayerSlotOne = %PlayerSlotOne%
Echo PlrSlot1Amnt = %PlrSlot1Amnt%
)>"SaveGame.sav"
如果将以下内容复制到主批处理文件中:
:LoadSection
If Not Exist "%~2" GoTo :EOF
Set "#="
For /F "Delims=:" %%A In ('"FindStr /BINC:"[%~1]" "%~2""') Do Set "#=%%A"
If Not Defined # GoTo :EOF
For /F "Tokens=1* Delims==" %%A In ('More +%#% "%~2"') Do (
Echo=%%A|FindStr /BC:"[">Nul && (For %%C In (# $A $B) Do Set "%%C="
GoTo :EOF)
Set "$A=" & Call :Isolate %%A & Call :Isolate %%B
Call Set "%%$A%%=%%$B%%")
GoTo :EOF
:Isolate
If Not Defined $A (Set "$A=%*") Else Set "$B=%*"
GoTo :EOF
然后您应该能够调用从特定部分加载变量,如下所示:
Call :LoadSection "Inventory" "SaveGame.sav"
在这种特殊情况下不需要双引号,因为字符串中没有要保留的字符,但我将它们用作最佳实践习惯。
我正在批量制作一个包含大量数据值的程序。我需要分块加载它们,但我最终可能会将它们全部保存在一起。如果我使用这种格式将值加载到 .sav 文件,我将如何从特定组加载它们?
(
echo "[playerdata]"
echo playername=%playername%
echo playerlevel=%playerlevel%
echo "[inventory]"
echo playerslotone=%playerslotone%
echo plrslot1amnt=%plrslot1amnt%
) > savegame.sav
我可能需要从 [player data] 和 [inventory] 中删除报价 headers。这只是一个例子,会有更多的价值和更多的细分市场。 我需要从一个段中加载一个精确的值,就像你从 ini 中加载一样。(但不是从 InI 中) Technoguyfication 在他对 [Save and Load .bat game] 的回应中的 ini 文件中使用了这种格式。感谢任何帮助。我是一个重度初学者,所以请考虑一下。
如果这似乎是重复的,我很抱歉。它不应该,因为我正在从 .sav 文件加载和保存,并使用新路径而不是仅使用命令。 Compo 的回应在这种情况下非常有帮助。我可能是错的,因为我说我是一个严重的初学者。
非常抱歉,谢谢。
当然建议删除那些包含部分名称的双引号。
您甚至可以使 .sav
文件看起来更漂亮,通过使用 TABs 和 s ,如果你愿意,例如
(
Echo [PlayerData]
Echo PlayerName = %PlayerName%
Echo PlayerLevel = %PlayerLevel%
Echo=
Echo [Inventory]
Echo PlayerSlotOne = %PlayerSlotOne%
Echo PlrSlot1Amnt = %PlrSlot1Amnt%
)>"SaveGame.sav"
如果将以下内容复制到主批处理文件中:
:LoadSection
If Not Exist "%~2" GoTo :EOF
Set "#="
For /F "Delims=:" %%A In ('"FindStr /BINC:"[%~1]" "%~2""') Do Set "#=%%A"
If Not Defined # GoTo :EOF
For /F "Tokens=1* Delims==" %%A In ('More +%#% "%~2"') Do (
Echo=%%A|FindStr /BC:"[">Nul && (For %%C In (# $A $B) Do Set "%%C="
GoTo :EOF)
Set "$A=" & Call :Isolate %%A & Call :Isolate %%B
Call Set "%%$A%%=%%$B%%")
GoTo :EOF
:Isolate
If Not Defined $A (Set "$A=%*") Else Set "$B=%*"
GoTo :EOF
然后您应该能够调用从特定部分加载变量,如下所示:
Call :LoadSection "Inventory" "SaveGame.sav"
在这种特殊情况下不需要双引号,因为字符串中没有要保留的字符,但我将它们用作最佳实践习惯。