我正在尝试制作一个批处理文件,在启动游戏之前备份《黑暗之魂 3》保存目录,然后启动游戏,然后检查游戏是否正在运行并再次备份,等待 900 秒后再执行此操作,并在游戏未运行时关闭程序。这是代码:
@ECHO OFF
TITLE Backup Save Dark Souls III
@ECHO We are locating the save folder
:: go to DS3 directory
cd %APPDATA%
cd C:\Users\Alec\Documents
mkdir DarkSoulsIII
:: reset to C: root
cd/
XCOPY /y /e C:\Users\Alec\AppData\Roaming\DarkSoulsIII C:\Users\Alec\Documents\DarkSoulsIII
@ECHO launch DS3
:: jump to drive
D:
@ECHO locating DS3 game directory
cd "D:\Steam Library\steamapps\common\DARK SOULS III\Game\"
@ECHO D:\Steam Library\steamapps\common\DARK SOULS III\Game\
START DarkSoulsIII.exe
TIMEOUT 10
:check_and_backup
@ECHO Checking if the game is still running
TASKLIST /FI "IMAGENAME eq DarkSoulsIII.exe
IF ERRORLEVEL 1 (
@ECHO Game is running backup
cd C:\Users\Alec\Documents
mkdir DarkSoulsIII
cd/
XCOPY /y /e C:\Users\Alec\AppData\Roaming\DarkSoulsIII C:\Users\Alec\Documents\DarkSoulsIII
@ECHO Backup Completed
TIMEOUT 900
GOTO :check_and_backup
)
PAUSE
我遇到的问题是,如果我添加 ELSE GOTO EOF,即使 Dark Souls III.exe 仍在运行,程序也会关闭。我喜欢 IF 中的 xcopy 的另一个问题是,它甚至可以执行以下任何操作:
TASKLIST /FI "IMAGENAME eq DarkSoulsIII.exe
IF ERRORLEVEL 1 (
@ECHO Game is running backup
cd C:\Users\Alec\Documents
mkdir DarkSoulsIII
cd/
XCOPY /y /e C:\Users\Alec\AppData\Roaming\DarkSoulsIII C:\Users\Alec\Documents\DarkSoulsIII
@ECHO Backup Completed
GOTO :check_and_backup
TIMEOUT 900
) ELSE (
GOTO EOF
)
答案1
我没有看到你之前的问题,但我知道你到目前为止的尝试已经取得了很大的进展,恭喜你。
但考虑一下它的标题..”似乎忽略了 IF 语句”...,带来了与涉及相同命令的问题混淆的可能性,因此(据称)您的问题很有可能接近(或等于)前一个问题并被关闭......
事实上,它是批量新出现的,这一点无需多言,您的代码会自发地暴露这一点,请用好眼光看待它,我去过那里,如果我将自己与这里的一些人进行比较,并且如果我将自己与这里的其他人进行比较,我仍然在那里,这是一部分。
我会尝试告诉你你的代码在做什么,同时提出一些选项,在此过程中我希望你能明白为什么if
不是你的问题。
1.%AppData%
如果运行/调用 bat 时它与你的或文件夹位于不同的驱动程序中%UserProfile%
,则使用/d
(找司机)按照您的cd
命令。
:: go to DS3 directory :: why go to folder 1: cd /d "%APPDATA%" :: do noting there? :: why go to folder 2: cd /d "%UserProfile%\Documents"
2.您可以使用完整路径创建文件夹,并且已经省略了使用文件夹存在的警告2>nul
,并且您无需输入它来创建文件夹。
@ECHO We are locating the save folder ... mkdir "%UserProfile%\Documents\DarkSoulsIII" 2>nul
- 观察:1你的蝙蝠不需要去任何文件夹来运行
mkdir
,,,,等等......tasklist
if
xcopy
3.如果您的命令获取了文件夹/驱动程序的完整路径,则无需转到驱动器c:
,和/或任何文件夹或从驱动器向下。xcopy
:: ------------------------------------------- remove next 4 lines -------- :: ::reset to C: root cd/ XCOPY /y /e C:\Users\Alec\AppData\Roaming\DarkSoulsIII C:\Users\Alec\Documents\DarkSoulsIII :: ------------------------------------------- use /i in xcopy command ---- :: XCOPY /y /e /i "%AppData%\DarkSoulsIII" "%UserProfile%Documents\DarkSoulsIII"
- 观察:2尝试运行
xcopy /?
并检查标志/I
If destination does not exist and copying more than one file, assumes that destination must be a directory.
4.运行start
指向可执行文件夹并在必要时/d "d:\FullPath\Folder\
executable
调用此运行。start
/b
@ECHO launch DS3 :: ------------------------------------------- remove next 7 lines -------- :: :: replace lines :: :: jump to drive D: @ECHO locating DS3 game directory cd "D:\Steam Library\steamapps\common\DARK SOULS III\Game\" @ECHO D:\Steam Library\steamapps\common\DARK SOULS III\Game\ START DarkSoulsIII.exe :: -------------------------------- use start "in" /d "D:\Path\" executable :: :: start "" /b /d "D:\Steam Library\steamapps\common\DARK SOULS III\Game\" DarkSoulsIII.exe
- 观察:3使用
start "in" /b
背景这样你的 bat 将继续运行,其他操作在下一行,否则下面的命令将等待开始完成然后继续。但请记住,这不是所有可执行文件的规则,有些会返回 bat 并继续,但有些则不会……
5.对于能够满足和/或可用于以下条件的命令,没有errorlevel
返回:tasklist
if
:check_and_backup @ECHO Checking if the game is still running TASKLIST /FI "IMAGENAME eq DarkSoulsIII.exe" IF ERRORLEVEL 1 (do if true) else (do because it is false)
- 无论是否找到(是否运行),您都会获得
errorlevel == 0
以下所有测试的条件:
(call ) & TASKLIST /FI "imagename eq Not_Running.exe" & echo\%errorlevel% cmd.exe /v /c "(call ) & TASKLIST /FI "imagename eq Not_Running.exe" & echo\!errorlevel!" cmd.exe /v /c "(call ) & TASKLIST /FI "imagename eq Not_Runnung.exe" & echo\!errorlevel!"
- 上述每个命令都返回 ErrorLevel
0
(第二行 => 0):
INFO: No tasks are running which match the specified criteria. 0
- 观察:4作为记录,运行时
explorer.exe
会返回相同的 ErrorLevel0
:
>cmd.exe /v /c "(call ) & TASKLIST /FI "imagename eq explorer.exe" & echo\!errorlevel! :: tasklist output: Image Name PID Session Name Session# Mem Usage :: tasklist output: ========================= ======== ================ =========== ============ :: tasklist output: explorer.exe 3420 Console 1 104,072 K 0
- .观察:5如果您尝试使用
&&
and||
运算符,其中&&
暗示如果前一个命令则执行操作return 0
,和/或||
如果前一个命令则执行操作return non 0
,也不起作用:
>TASKLIST /FI "imagename eq Not_Running.exe" && pause INFO: No tasks are running which match the specified criteria. Press any key to continue . . . >TASKLIST /FI "imagename eq Not_Running.exe" || pause INFO: No tasks are running which match the specified criteria.
8.删除mkdir ...
上面第 7 行的重复命令。
IF ERRORLEVEL 1 ( ... mkdir DarkSoulsIII // remove line ... )
9.使用系统变量并将重定向(|
)添加到find
命令中并替换if
为运算符||
(return non zero
)。
@echo off setlocal title Backup Save Dark Souls III call :check_and_backup DarkSoulsIII.exe :check_and_backup Checking if the game is still running >nul tasklist /nh /fo csv | find /i "DarkSoulsIII.exe" || ( echo\Game is Running Backup mkdir "%UserProfile%\Documents\DarkSoulsIII" 2>nul xcopy /y /e /i "%AppData%\roaming\darksoulsiii" >"%UserProfile%\documents\darksoulsII" echo\Backup Completed if /i "%~nx1" == "DarkSoulsIII.exe" 2>nul ( start "" /b /d "D:\Steam Library\SteamApps\Common\Dark Souls III\Game\" DarkSoulsIII.exe timeout /t 900 /nobreak exit /b > ) timeout /t 10 /nobreak goto :check_and_backup ) goto :eof & endlocal & pause
观察:6使用系统变量%AppData%
&%UserProfile%
Your can replace literal path to: C:\Users\Alec\AppData\Roaming\DarkSoulsIII %AppData%\Roaming\DarkSoulsIII C:\Users\Alec\Documents\DarkSoulsIII %UserProfile%\Documents\DarkSoulsIII
观察:7您可以:label
通过两种方式使用您的,一是最初使用调用并传递的名称DarkSoulsIII.exe
,然后让标签检查是否%~1
传递了任何参数来启动DarkSoulsIII.exe
,如果它没有运行,则运行xcopy
,同时执行相应的超时。
call :check_and_backup DarkSoulsIII.exe .... if /i "%~nx1" == "DarkSoulsIII.exe" 2>nul ( )
观察:8对于 cmd/bat 中的某些命令(第三方可执行文件也是如此),errorlevel 的行为可能与命令的操作相对应,而不是完全指的是获得的结果,在这些情况下,处理重定向的命令输出可能比结果本身更精确,我建议使用find
或(findst
,more
和/或其他),以及运算符运算符&&
和/或||
,在您的情况下,对于您的具体情况,errorlevel 1
运算符return non 0
== 。||