首页 > 解决方案 > 批处理文件 IF 语句评估问题

问题描述

如果我犯了明显的错误,请原谅。

我一直在处理的批处理文件是准备一些文件夹(D:\Backups_pc 和子文件夹 Backup_Main 和 Backup_Copy)。取决于它们在连接时是否存在于 D: 驱动器上。

批处理文件第一次运行时会创建文件夹,然后将必要的文件夹和文件 Robocopy 到“Backup_Main”中。批处理文件在同一个 D 驱动器上执行的第二次和后续时间应该将 Backup_Main 复制到 Backup_Copy 并且 Robocopy 更新 Backup_Main。

它不这样做,但总是去'KDTFirstRun'。

我已经尝试 IF EXIST D:\Backups_pc\Backup_Copy 来评估文件夹的存在,并且在这个版本中做了类似的事情,所以在这个版本中我尝试首先检查所有内容并存储它,认为某些东西可能被缓冲或没有正确评估所以尝试预设它(可以这么说)。它没有奏效,所以我很茫然。我在变量定义、数学或任何导致问题的东西中看不到空格,还是我失明了?

一些帮助将不胜感激。谢谢你。菲尔。

@ECHO off 
SETLOCAL

::   Batchfile to do two types of backup

::   Attempt using variables defined here and set to ZERO

SET /A RootB=0
SET /A MainB=0
SET /A CopyB=0

::  Set the Variables based on folders being in place or not

IF EXIST "D:\Backups_pc\" SET /A RootB=1
IF EXIST "D:\Backups_pc\Backup_Main\"  SET /A MainB=1
IF EXIST "D:\Backups_pc\Backup_Copy\" SET /A CopyB=1

:: Diagnostics Echo reports

ECHO R = %RootB%
ECHO M = %MainB%
ECHO C = %CopyB%

SET /A KDTCheck = %RootB% + %MainB% + %CopyB%

ECHO KDTCheck is %KDTCheck%
PAUSE

IF /I KDTCheck EQU 3 GOTO KDTUPdate
IF /I KDTCHeck EQU 2 GOTO KDTFolderError
IF /I KDTCheck EQU 1 GOTO KDTFolderError
IF /I KDTCheck EQU 0 GOTO KDTFirstRun

:KDTFirstRun

ECHO Initialising System and Preparing Backup_Copy.

:: Create the necessary folders, I know I could get smarter but lets get the IF stuff working first.

MD D:\Backups_pc
MD D:\Backups_pc\Backup_Main
MD D:\Backups_pc\Backup_Copy

ECHO Folders created on D Drive
ECHO Backing Up Backup_Main

::  Robocopy a lot of folders

ECHO Backup_Main has been updated with latest data from your computer.  
GOTO KDTend


:KDTUpdate
ECHO Updating Backup_Copy.
::  Copy the Backup_Main to Backup_Copy
ECHO In KDTUPdateMain Updating Backup_Main

:: Re run the Robocopy stuff that was done in KDTFirstRun

ECHO Backup_Main has been updated with latest data from your computer.  

GOTO KDTend

:KDTFolderError

:: Some limited diagnostics to view.
ECHO There is a problem with the Backup Folders on Drive D.
ECHO R = %RootB%
ECHO M = %MainB%
ECHO C = %CopyB%
ECHO KDTCheck is %KDTCheck%

:KDTend
ENDLOCAL
PAUSE
@ECHO ON

标签: batch-filecmd

解决方案


问题在这里:

IF /I KDTCheck EQU 3 GOTO KDTUPdate

您需要%变量周围的变量标记:

IF %KDTCheck% EQU 3 GOTO KDTUPdate

没有这些,它会比较字符串 KDTCheck而不是变量内容。而且,因为所有if语句都失败了,所以它只是通过下面的代码。

您会注意到我还删除了/I,对数字进行不区分大小写的比较几乎没有意义。


简而言之,比较代码片段最好写成:

REM Go to specific action or error part if invalid setup.

IF %KDTCheck% EQU 3 GOTO KDTUpdate
IF %KDTCheck% EQU 0 GOTO KDTFirstRun
GOTO KDTFolderError

:KDTFirstRun

::顺便说一句,用于评论不是一个好主意。这实际上是一个标签类型的结构,如果你在错误的地方使用它,会导致你非常焦虑和咬牙切齿,例如:

if %optn%==1 (
    :: Option 1 chosen
    goto option1_code
)

有关这方面的更多信息,请参见此处


推荐阅读