定时自动保存批处理

时间:2014-05-10 03:35:13

标签: variables loops batch-file if-statement automation

我目前正在我的电脑上模拟ps2游戏,并希望获得损失保险 Savedata 所以在pcsx2中你可以通过按F1(和F2切换到下一个插槽)来保存

此片段是用于ps2目的的更大文件的一部分(如果需要,我可以发布) 但它应该基本实现的是检查pcsx2.exe是否正在运行 每0.1秒一次,每3分钟保存一次游戏 当我运行此代码时,Batch脚本立即退出而不可能 eveen看到一条错误消息。 任何人都可以告诉我这可能有什么问题,还是问题必须在其他地方?

SET /a time=0

:loop

if %time%==180(
     nircmd.exe sendkey F1 press 
     nircmd.exe sendkey F2 press
        SET /a time=0

)

    tasklist /FI "IMAGENAME eq pcsx2-r5875.exe" 2>NUL | find /I /N "pcsx2r5875.exe">NUL
    nircmd.exe wait 100
    set /a time+=1


    if "%ERRORLEVEL%"=="0" goto loop

编辑:为任何感兴趣的人完成工作脚本

@ echo off
nircmd.exe cmdwait 10 nircmd.exe sendkey 0x5B down 
nircmd.exe cmdwait 10 nircmd.exe sendkey D press
nircmd.exe cmdwait 10 nircmd.exe sendkey 0x5B up
::simulates windows+D to close all windows

taskkill /f /im explorer.exe 
::kills explorer
start /d "C:\Program Files (x86)\Google\Drive" googledrivesync.exe
::Google Drive to backup save files
start /d "C:\Program Files\MotioninJoy\ds3" DS3_Tool.exe
::DS3 Tool to play with wireless playstation controller
start %windir%\System32\DisplaySwitch.exe /internal
::switches to Single-Display mode

start /d "C:\Program Files (x86)\PCSX2 1.2.1" pcsx2-r5875.exe
::starts emulator

SET timeloop=0
goto loop2
:loop
    SET timeloop=0
    nircmd.exe sendkey F1 press 
    nircmd.exe sendkey F2 press
    echo Saved at %time%
  :loop2
      nircmd.exe wait 100
      set /a timeloop+=1
      tasklist /FI "IMAGENAME eq pcsx2-r5875.exe" 2>NUL | find /I /N "pcsx2-r5875.exe">NUL || goto EndOfLoop
      if %timeloop% LSS 1800 goto :loop2
goto loop
:EndOfLoop
::loop that autosaves to a different slot every 3 minutes and exits if emulator exits

start %windir%\System32\DisplaySwitch.exe /extend
taskkill /f /im googledrivesync.exe
taskkill /f /im explorer.exe
taskkill /f /im DS3_Tool.exe
start explorer.exe
::finally everything is cleaned up

感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

由于您只向我们展示了批次的一部分,这很难说,但是

if %time%==180(

在语法上是不正确的两个计数。

首先,必须180(之间的空格

其次,timemagic variable,它以用户当前选择的格式返回当前系统时间。在我的例子中,这是hh:mm:ss:ms - 最不可能匹配180。设置名为time的用户环境变量后,用户变量将覆盖magic variable。 (这是一个副作用,但通常不是一个好主意)

可能修复这些可以解决您的问题 - 并且策略性地插入pause命令可以让您看到错误消息(就像在if行之后......当然,您必须能够猜测策略在哪里,并伴随着练习......)

答案 1 :(得分:1)

这应该有效 - 并且在关闭可执行文件并完成循环时退出。

不要将系统变量用作普通变量,例如time date username等。

:loop
    SET timeloop=0
    tasklist /FI "IMAGENAME eq pcsx2-r5875.exe" 2>NUL | find /I /N "pcsx2r5875.exe">NUL || goto :EOF
    nircmd.exe sendkey F1 press 
    nircmd.exe sendkey F2 press
  :loop2
      nircmd.exe wait 100
      set /a timeloop+=1
      if %timeloop% LSS 180 goto :loop2
goto loop