【问题标题】:Batch File IF Statement evaluation problems批处理文件 IF 语句评估问题
【发布时间】:2019-11-24 00:09:17
【问题描述】:

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

我一直在处理的批处理文件是准备一些文件夹(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

【问题讨论】:

  • 衷心感谢 paxdiablo 提供的所有建议。它只是显示了一些在线“教程”如何误导您。这就是我从中获得 REM 的 :: 的地方。

标签: batch-file cmd


【解决方案1】:

问题出在这里:

IF /I KDTCheck EQU 3 GOTO KDTUPdate

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

IF %KDTCheck% EQU 3 GOTO KDTUPdate

没有这些,它会比较 string KDTCheck 而不是变量内容。而且,因为所有if 语句都失败了,所以它只是直接进入下面的代码。

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


简而言之,比较代码 sn-p 最好写成:

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

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

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

有关更多信息,请参阅here

【讨论】:

    猜你喜欢
    • 2021-06-23
    • 1970-01-01
    • 2017-08-01
    • 2013-06-01
    • 1970-01-01
    • 2022-01-09
    • 2014-06-16
    • 2023-03-20
    • 2022-01-11
    相关资源
    最近更新 更多