Board logo

标题: [其他] 玩游戏存档切换 [打印本页]

作者: 珠七七    时间: 2017-2-28 11:41     标题: 玩游戏存档切换

大家好,本人玩win10星球大战这个游戏,有两个存档文件,命名为新和旧。
先附上代码:
  1. @echo off
  2. rem 设置背景颜色。
  3. color 07
  4. rem 设置游戏存档路径。
  5. set lz0=C:\Users\James\AppData\Local\Packages\Disney.StarWarsCommander_6rarf9sa4v8jt\LocalState\
  6. rem 设置游戏存档备份路径。
  7. set lz1=D:\game\GameData_bak\
  8. rem 设置新旧游戏存档名称。
  9. set gamedata=playerprefs.dat
  10. set old_data=playerprefs_old.dat
  11. set new_data=playerprefs_new.dat
  12. rem 设置确保游戏进程开启的循环次数。
  13. set tnum=5
  14. :again
  15. rem 程序开始
  16. echo 判断游戏进程是否存在。
  17. call :判断游戏进程
  18. if %errorlevel%==1 (
  19. echo 游戏是开启的,关闭进程。
  20. rem taskkill /f /t /im Commander.exe
  21. )
  22. if %errorlevel%==0 (echo 游戏没有启动的。)
  23. echo 1
  24. pause
  25. rem 判断游戏新旧存档是否存在,如没有复制所需的存档到游戏存档目录。
  26. echo 判断游戏所需存档是否存在。
  27. if exist %old_data% (echo 已经存在旧游戏存档) else (
  28. echo 旧游戏存档不存在
  29. copy /b "D:\game\GameData_bak\playerprefs_old.dat" "C:\Users\James\AppData\Local\Packages\Disney.StarWarsCommander_6rarf9sa4v8jt\LocalState\"
  30. )
  31. if exist %new_data% (echo 已经存在新游戏存档) else (
  32. echo 新游戏存档不存在
  33. copy /b "D:\game\GameData_bak\playerprefs_new.dat" "C:\Users\James\AppData\Local\Packages\Disney.StarWarsCommander_6rarf9sa4v8jt\LocalState\"
  34. )
  35. if exist %gamedata% (echo 已经存在%gamedata%) else (
  36. echo 游戏存档不存在
  37. copy /b "D:\game\GameData_bak\playerprefs_new.dat" "C:\Users\James\AppData\Local\Packages\Disney.StarWarsCommander_6rarf9sa4v8jt\LocalState\playerprefs.dat"
  38. call :启动游戏
  39. )
  40. ping 127.1 -n 3 >nul
  41. echo 2&pause
  42. echo 开始比较存档文件版本
  43. type "playerprefs.dat"|find "34ea5f9c">nul
  44. if %errorlevel%==0 (goto new)
  45. type "playerprefs.dat"|find "4b2a7eec">nul
  46. if %errorlevel%==0 (goto old)
  47. )
  48. echo 未找到新或旧的存档,正在复制新的存档作为游戏数据。
  49. del playerprefs.dat
  50. ping 127.1 -n 2 >nul
  51. copy "D:\game\GameData_bak\playerprefs_new.dat" "playerprefs.dat"
  52. echo 已完成。
  53. ping 127.1 -n 5 >nul
  54. color 2f
  55. pause
  56. goto again
  57. :new
  58. echo 找到新的记录文件,正在替换旧的记录文件。
  59. del playerprefs.dat
  60. ping 127.1 -n 2 >nul
  61. copy "D:\game\GameData_bak\playerprefs_old.dat" "playerprefs.dat"
  62. echo 完成将旧文件替换成现在的游戏存档
  63. goto queren
  64. :old
  65. echo 找到旧的记录文件,正在替换新的记录文件。
  66. del playerprefs.dat
  67. ping 127.1 -n 2 >nul
  68. copy "D:\game\GameData_bak\playerprefs_new.dat" "playerprefs.dat"
  69. echo 完成将新文件替换成现在的游戏存档
  70. goto queren
  71. :queren
  72. type "playerprefs.dat"|find "34ea">nul
  73. if %errorlevel%==0 (echo 现在是新文件)
  74. type "playerprefs.dat"|find "4b2a">nul
  75. if %errorlevel%==0 (echo 现在是旧文件)
  76. color 2f
  77. call :启动游戏
  78. echo 确保游戏是打开状态。
  79. set n=0
  80. set num=0
  81. :Contrast
  82. ping 127.0.0.1 -n 3 >nul
  83. echo.
  84. call :判断游戏进程
  85. set /a num=n+1
  86. if "game"=="close" (
  87. echo.
  88. echo 第%num%次判断,游戏是没有打开的。
  89. echo 计数器重新计算!
  90. echo.
  91. call :启动游戏
  92. set n=0&set num=0
  93. ) else (
  94. echo 第%num%次判断,游戏是打开的。
  95. set /a n+=1
  96. echo.
  97. )
  98. ping 127.0.0.1 -n 2 >nul
  99. if %n% GEQ %tnum% (
  100. echo 已完成游戏切换账号。
  101. echo 如再按任何键将再次切换。
  102. ) else (goto Contrast)
  103. echo.
  104. pause
  105. goto again
  106. :判断游戏进程
  107. tasklist /nh|find /i "Commander.exe"
  108. ping 127.0.0.1 -n 3 >nul
  109. :启动游戏
  110. start "正在启动游戏" "D:\game\GameData_bak\Star Wars:指挥官.lnk"
复制代码
具体流程 是,先判断游戏进程是否存在,再判断存档文件(a)是否存在,不存在就复制存档备份(b)里的存档到a里,如果存在就启动游戏,并确认进程是存在的。接着暂停。
按下任意键后,就开始切换游戏存档。如果是新的就换成旧,如果是旧的就换成新。打开游戏,并确认进程是存在的。

上面的代码有些疑问,希望热心的高手帮我解答一下。
疑问:
1、运行到echo 1后,直接启动游戏并暂停批处理。但代码没有启动游戏的,是哪里出了问题?
2、call :判断游戏进程那里,判断游戏进程是否存在,errorlevel的值会传递出来吗?如果不能,因为想把全部代码集中在同一个批处理,我应该使用什么参数呢?
3、我设置了路径,在复制存档的时候,是否用这些路径作为变量使用呢?(如:copy /b "D:\game\GameData_bak\playerprefs_new.dat" "C:\Users\James\AppData\Local\Packages\Disney.StarWarsCommander_6rarf9sa4v8jt\LocalState\",是否可以取代成:copy /b "%lz1%playerprefs_new.dat" "%lz0%")
请大家不吝赐教,感谢感谢!
作者: GNU    时间: 2017-2-28 13:51

45行和46楼是否应该互换位置?
作者: 我来了    时间: 2017-2-28 21:54

本帖最后由 我来了 于 2017-2-28 22:11 编辑

以下是AHK版本的,
随便写的伪代码


F1::            热键是F1
Process, wait, game.exe, 3
NewPID = %ErrorLevel%  ; 由于 ErrorLevel 会经常发生改变, 所以要立即保存这个值.
if NewPID = 0
{
    MsgBox 指定的进程在3秒内未出现!
    return
}
else
{
MsgBox 您要的进程确实存在 (进程的ID是 %NewPID%)
IfNotExist, C:\游戏存档.ini
{    ;MsgBox, C:\游戏存档.ini存档文件不存在
        FileCopy, D:\游戏存档.ini, C:\游戏存档.ini
        }
       
IfExist, C:\游戏存档.ini       
{
Run , c:\game.exe
}
       
}

因为AHK的按键控制比较牛逼~~
建议楼主设两个热键,这样就能远程控制了。
作者: happy886rr    时间: 2017-2-28 21:57

回复 3# 我来了
不错,头像还是那么靓丽。
作者: 我来了    时间: 2017-2-28 22:19

playerprefs_old.dat
playerprefs_new.dat
这个你在单独存到一个目录中方便调用

楼主的描述有些含糊:
判断是否有进程
A存在                                                                   B不存在
就启动游戏                                                            不存在就复制 存档

按下暂停啥意思,弄不明白。
作者: a2002    时间: 2017-6-29 15:42

本帖最后由 a2002 于 2017-6-29 15:46 编辑

你用了call命令后没有返回,跳转至”:启动游戏“标签了
应该在“:启动游戏”前加一行:goto :eof 或 exit /b




欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2