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

问题描述 投票:0回答:1

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

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

第一次运行批处理文件时,它会创建文件夹,然后将所需的文件夹和文件自动复制到“ 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-file cmd
1个回答
0
投票

问题在这里:

IF /I KDTCheck EQU 3 GOTO KDTUPdate

您需要在变量周围使用%变量标记:

IF %KDTCheck% EQU 3 GOTO KDTUPdate

没有这些,它是在比较[[string KDTCheck,而不是变量内容。并且,由于所有if语句均失败,因此仅进入以下代码。

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


简而言之,比较代码段最好写成(如果没有通过其他比较,则只有零的检查,这是唯一的可能):

IF %KDTCheck% EQU 3 GOTO KDTUPdate IF %KDTCHeck% EQU 2 GOTO KDTFolderError IF %KDTCheck% EQU 1 GOTO KDTFolderError :KDTFirstRun

© www.soinside.com 2019 - 2024. All rights reserved.