代码总是在不应该关闭的时候关闭,并且似乎忽略了 IF 语句(不确定,对 Batch 来说很新)

代码总是在不应该关闭的时候关闭,并且似乎忽略了 IF 语句(不确定,对 Batch 来说很新)

我正在尝试制作一个批处理文件,在启动游戏之前备份《黑暗之魂 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,,,,等等......tasklistifxcopy

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返回:tasklistif

: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会返回相同的 ErrorLevel 0
>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或(findstmore和/或其他),以及运算符运算符&&和/或||,在您的情况下,对于您的具体情况,errorlevel 1运算符return non 0== 。||


其他资源:

相关内容