批处理文件 IF 语句评估问题



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

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

第一次运行批处理文件时,它会创建文件夹,然后将必要的文件夹和文件复制到"Backup_Main"中。 第二次及以后在同一 D 驱动器上执行批处理文件时,它应将Backup_Main复制到Backup_Copy,Robocopy 将更新Backup_Main。

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

我已经尝试过如果存在 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_pcBackup_Main"  SET /A MainB=1
IF EXIST "D:Backups_pcBackup_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_pcBackup_Main
MD D:Backups_pcBackup_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

问题就在这里:

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
)

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

最新更新