2013-08-06 70 views
1

我制作了一个角色文件,其中我的游戏从中抽取数据和变量。看起来像这样:关于批处理游戏,查找并替换字符串

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

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

例如,如果没有任何意义,我有100健康。我升级,从而使我的健康状态提高120%,所以现在我有120的健康状况。我想查找字符串“playerHP = 100”并将其替换为“playerHP = 120”。

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

编辑:而不是搜索字符串和替换我接受了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只是作为一个等待函数,用于在回显新数据之前删除文件。似乎工作正常。感谢所有

+0

可能重复[批处理脚本来替换一个.ini线(http://stackoverflow.com/questions/17800581/batch -script-to-replace-line-in-in-ini) – jeb

+0

另请试试看[SO:你如何为一个批处理rpg保存/加载cmd?](http://stackoverflow.com/q/ 17081050/463115) – jeb

+0

我看着他们,仍然有点困惑。我可以删除文件并输出新的信息,而不是查找和替换。我不确定是否有一个简单的命令可以让我这样做。 有没有办法用新信息替换文本文件中的某一行?这就是我所需要的全部 – user2654489

回答

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

要保存在一个文件中的数据,你可以使用块像

(
    echo playerName=%playerName% 
    echo playerRace=%playerRace% 
    echo playerHP=%playerHP% 
) > player.ini 

A第二加载它,你可以使用

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

Presumeably也无所谓什么顺序值出现在你的文件。如果是这样,那么以下内容将有效地“编辑”你的文件。

它首先使用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 # 

一个全新的文件将各包含所有的当前值时创建的。

要加载的价值观,你做的正是杰布建议:

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