关于批量游戏,查找并替换字符串

时间:2013-08-06 16:07:46

标签: batch-file echo

我制作了一个角色文件,我的游戏从中提取数据和变量。看起来像这样:

playerName= Marche
playerRace= Elf
playerHP= 100
playerSPD= 200
playerATK= 120
playerDEF= 70

最终幻想引用任何人......?无论如何,当角色升级时,我需要一个批处理脚本来找到字符串“playerHP = 100”。 playerHP 在脚本中设置为变量。基本上,它需要当前的健康状况,并将其乘以120%,从而增加数量。如何回显该数学结果以替换当前数字?

例如,如果这没有任何意义,我有100健康。我升级,因此我的健康状况增加了120%,所以现在我有120健康。我想找到字符串“playerHP = 100”并将其替换为“playerHP = 120”。

如果可以避免,我不想下载任何其他命令(我已经看过几次)。非常感谢

编辑:不是搜索字符串而是替换我接受了jeb的建议,只是删除了文件并重新回显了所有数据。结果看起来像这样:

set /a LeveledUpPlayerHP=(%ppHP%* 12) / (10)
set /a LeveledUpPlayerSPD=(%ppSPD%* 12) / (10)
set /a LeveledUpPlayerATK=(%ppATK%* 12) / (10)
set /a LeveledUpPlayerDEF=(%ppDEF%* 12) / (10)
echo Updating stats...
del "C:\Users\%USERNAME%\Desktop\CMDRPG\player\playerData.dll
ping 1.1.1.1 -n 1 -w 500 > nul
echo playerName= %playerName%>playerData.dll
echo playerRace= %playerRace%>>playerData.dll
echo playerHP= %LeveledUpPlayerHP%>>playerData.dll
echo playerSPD= %LeveledUpPlayerSPD%>>playerData.dll
echo playerATK= %LeveledUpPlayerATK%>>playerData.dll
echo playerDEF= %LeveledUpPlayerDEF%>>playerData.dll

在此部分代码之前加载了playerName和playerRace。 Ping仅用作等待函数,以便在回显新数据之前删除文件。好像工作还可以。谢谢大家

3 个答案:

答案 0 :(得分:2)

试试这个(输出在%inifile%.new):

@ECHO OFF &SETLOCAL ENABLEDELAYEDEXPANSION
SET "inifile=file"

FOR /f %%a IN ('^<"%inifile%" find /c /v ""') DO SET /a lines=%%a
< "%inifile%" (
FOR /l %%a IN (1,1,%lines%) DO (
    SET "line="
    SET /p "line="
    IF NOT "!line:playerHP=!"=="!line!" (
        FOR /f "tokens=2delims= " %%b IN ("!line!") DO SET /a HP=%%b*12/10
        SET "line=playerHP= !HP!"
    )
    ECHO(!line!
))>"%inifile%.new"

输入/输出:

>type file
playerName= Marche
playerRace= Elf
playerHP= 100
playerSPD= 200
playerATK= 120
playerDEF= 70

>test.bat

>type file.new
playerName= Marche
playerRace= Elf
playerHP= 120
playerSPD= 200
playerATK= 120
playerDEF= 70

答案 1 :(得分:2)

假设值在您的文件中出现的顺序无关紧要。如果是这样,那么以下内容将有效地“编辑”您的文件。

它首先使用FINDSTR来隔离当前的playerHP值,并使用FOR / F来解析字符串中的值。 SET / A增加playerHP。然后使用FINDSTR创建一个新文件,为playerHP写入除之外的所有当前值,然后将新的playerHP信息附加到末尾。

@echo off
set "file=gameData.txt"
for /f "tokens=2 delims==" %%N in ('findstr /bl "playerHP=" "%file%"') do set /a "newHP=%%N*120/100"
>"%file%.mod" (
  findstr /blv "playerHP=" "%file%"
  echo playerHP=%newHP%
)
move /y "%file%.mod" "%file%" >nul

但为什么要去那么麻烦呢。我认为你已经将所有值都作为环境变量存储在内存中。只需确保要存储在文件中的所有变量都以公共唯一前缀开头。在你的例子中,它们都以“玩家”开头,但你可能想要一些更通用的东西 - 也许是像#这样的符号。所以你可以拥有#playerName,#playerRace等。

只需根据需要更新内存中的值即可。当需要将当前游戏状态保存到文件时,您需要做的只是

>"gameData.txt" set #

每次包含所有当前值时,都会创建一个全新的文件。

要加载这些值,您可以完全按照jeb的建议进行操作:

for /f "usebackq delims=" %%A in ("gameData.txt") do set %%A

答案 2 :(得分:1)

要将数据保存在文件中,可以使用

之类的块
(
  echo playerName=%playerName%
  echo playerRace=%playerRace%
  echo playerHP=%playerHP%
) > player.ini

要加载它,您可以使用

for /F "delims=" %%L in (player.ini) do set "%%L"