batch-file - 批处理文件 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
解决方案
问题在这里:
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
)
有关这方面的更多信息,请参见此处。
推荐阅读
- node.js - 使用 socket.io 时客户端未连接
- javascript - 触发元素上的 JQuery MouseMove
- jpa - 将 JPA @ElementCollection 用于连接表中的字符串集合?
- django - 根据用户Django的权限制作动态侧边栏
- python - 如何使用 BAC0 设置每周计划
- function - 此 LISP 代码中的递归和控制结构与普通函数和控制结构有何不同?
- javascript - 如何在jquery中找到第一行第一个锚标记?
- c++ - 如何使用指针从双端队列中删除特定元素
- android - pubspec.yaml 中版本升级时出错
- javascript - Javascript 全局格式货币