为什么我的IF比较操作失败?

更新已解决 – 问题不在我的代码。 在命令处理器中有一个devise限制(有些人可能会说“bug”)。 在Windows 2000,XP和Server 2003上,IF比较运算符不能使用高于2147483648的值进行testing和复制。

现在我只需要弄清楚如何去掉这个解决方法的一些最不重要的数字。 感谢大家的阅读。

=========

你好在cyberland,

我pipe理一个小公司的networking。 我试图build立一个使用在服务器上运行的batch file的自动归档过程,并且需要一点逻辑帮助。 我不是程序员,也没有时间学习PowerShell或VBscript。 我已经阅读并重新阅读关于IF,FOR和CALL的MS命令参考,并且无法弄清楚我做错了什么。

我们有一个带有两个磁盘驱动器和一个磁带驱动器的Windows 2000 Server。 一个磁盘有一个共享文件夹,称之为Public; 另一个磁盘不共享,称它为Staging。

公共驱动器将接受来自客户端桌面的传入备份。 我需要该过程将文件从公共驱动器移动到暂存驱动器,直到驱动器太满,无法接受任何更多的文件,于是磁带备份开始。 磁带运行完成后,分段驱动器将被清空,并且过程将继续将文件从公共移动到分段。

我们的目标是自动永久地将桌面备份文件存档到磁带上,除了更换磁带外,不需要用户干预。

你可能会问,为什么涉及两个驱动器? 两个原因:

1)如果桌面直接备份到登台驱动器,则在某个时刻,客户端桌面备份将因目标驱动器上缺less空间而失败。 我无法预测何时会发生。 我能想到的唯一可定义的条件是可用磁盘空间的任意阈值,但是由于要归档的备份文件将是不同的大小,所以我可能遇到目标驱动器可用空间高于阈值的情况,但是下一个备份超出了这个空间 结果:客户端桌面备份失败,服务器磁带备份无法启动。

2)如果由于某种原因(磁带未更改或其他原因)导致磁带备份失败,将磁盘备份到公共磁带机时,我需要一些时间来修复磁带问题,以防止桌面备份开始失败。

这是我试图编码的algorithm:

1)开始

2)获取暂存驱动器上的可用空间

3)获取公共驱动器上最小文件的大小(如果没有文件存在,则退出)

4)比较文件大小与分段驱动器上的可用空间

5)如果文件将适合,将其移动到分段驱动器; 否则,退出并启动磁带备份

6)返回到开始

这里是我的批处理代码不工作。 在testing的这个阶段,我在公共驱动器中有一个文件(8 GB),它将放在暂存驱动器上的可用空间(32 GB)中。 set命令确认variables正在按照预期设置; 该过程在语句[如%BKFsize%LSS%DiskFree%]]上失败,而不是被移动的文件,而是调用由'else'指定的磁带例程:

@echo off setlocal enableextensions enabledelayedexpansion :Begin REM obtain and display free space on Staging drive. D: for /f "tokens=3 delims= " %%A in ('dir ^| find "bytes free"') do ( set Z=%%A set Z=!Z:,=! ) set DiskFree=!Z! echo. echo D: has %DiskFree% bytes free echo. REM obtain sizes of files on Public drive to be moved. E: cd \backup.email if not exist *.bkf exit dir *.bkf /b /os > BKFlist.txt for /f "tokens=*" %%G in (BKFlist.txt) do call :CheckBKF "%%G" goto :eof :CheckBKF set BKFfile=%1 set BKFsize=%~z1 echo. echo File %BKFfile% is %BKFsize% bytes echo. set pause REM move file(s) to Staging drive, space permitting; or, REM if not enough space for smallest file, start tape backup. if %BKFsize% LSS %DiskFree% ( echo Moving file %BKFfile% to drive D echo. move E:\backup.email\%BKFfile% D:\backup.email ) else ( C:\WINNT\AutoBackup\TapeBKF.cmd exit ) goto Begin :End 

我知道这一定是相当简单的,但就像我说的,我不是程序员,而且我向你的高级技能倾诉。 任何意见非常感谢,并感谢你。