为什么我的IF比较失败?

时间:2011-03-25 19:26:54

标签: windows batch-file for-loop if-statement call

更新已解决 - 问题不在我的代码中。命令处理器中存在设计限制(有些人可能会说“bug”)。 IF比较运算符不适用于高于2147483648的值。现在我只需要弄清楚如何去除一些最低有效数字的变通方法。感谢大家的阅读。

=======

你好,在cyberland,

我管理一家小公司的网络。我正在尝试使用在服务器上运行的批处理文件来设置自动存档过程,并且需要对逻辑有一点帮助。我不是程序员,也没有时间学习PowerShell或VBscript。我已经阅读并重新读取了IF,FOR和CALL上的MS命令参考,并且无法弄清楚我做错了什么。

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

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

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

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

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

2)如果暂存驱动器填满并且磁带备份由于某种原因(磁带未更改或其他原因)而失败,那么让桌面备份到公共驱动器会花一些时间在桌面备份开始之前修复磁带问题失败。

以下是我正在尝试编码的算法:

1)开始

2)在分段驱动器上获得可用空间

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

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

5)如果文件适合,则将其移至Staging drive;否则,退出并启动磁带备份

6)返回开始

这是我的批处理代码无效。在测试的这个阶段,我在公共驱动器中有一个文件(8 GB),它将适合Staging驱动器上的可用空间(32 GB)。 set命令确认变量正在按预期设置;该过程在语句[如果%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

我知道这一定相当简单,但就像我说的那样,我不是程序员,我向你的优秀技能低头。非常感谢任何建议,谢谢。

2 个答案:

答案 0 :(得分:1)

您的变量中包含的值可能不是整数而是字符串

我想它正在比较:8< 3 == false

答案 1 :(得分:1)

在批处理文件中,字符串和整数类型之间没有真正的区别,但这不是你的问题。

问题是整数只能在32位有符号范围内工作 -2147483648至2147483647

但是你的文件大小更大,也是你的磁盘空间。 要测试这个,您可以尝试添加一个。

Set /a myvar=BKFsize+1
Set /a myvar=DiskFree+1

我想你得到一个错误。

您可以解决它,如果您尝试使用字符串比较,目前您进行字符串比较,但您的数字长度不同,因此您会得到“不可预测的”结果。
但是如果你用零调整/填充字符串使它们具有相同的长度,它应该工作。

set "strBKSize=000000000000000000%bkSize%"
set "strBKSize=%strBKSize:~-15%"
set "strDisksize=000000000000000000%Disksize%"
set "strDisksize=%strDisksize:~-15%"

或者您尝试不用字节计算,但以MB或GB为单位,删除6或9个数字/字符。

set BKFsizeGB=%BKFsize:~0,-9%

然后你可以将它们用作数字。