更新已解决 - 问题不在于我的代码。命令处理器中存在设计限制(有些人可能会说是“错误”)。IF 比较运算符不适用于高于 2147483648 的值。已在 Windows 2000、XP 和 Server 2003 上进行测试和复制。
现在我只需要弄清楚如何去掉一些最低有效的数字来解决这个问题。感谢大家的阅读。
=========
大家好,网络世界里的各位,
我管理一家小公司的网络。我正尝试使用服务器上运行的批处理文件设置自动存档过程,需要一些逻辑方面的帮助。我不是程序员,也没有时间学习 PowerShell 或 VBscript。我已经阅读并重读了有关 IF、FOR 和 CALL 的 MS 命令参考,但找不到我做错了什么。
我们有一台 Windows 2000 Server,上面有两个磁盘驱动器和一个磁带驱动器。一个磁盘有一个共享文件夹,称为 Public;另一个磁盘没有共享,称为 Staging。
公共驱动器将接受来自客户端桌面的传入备份。我需要将文件从公共驱动器移动到暂存驱动器,直到驱动器太满而无法再接受任何文件,然后开始磁带备份。磁带运行完成后,暂存驱动器将被清空,然后该过程将继续将文件从公共驱动器移动到暂存驱动器。
目标是自动且永久地将桌面备份文件存档到磁带,除了更换磁带外无需用户干预。
你可能会问,为什么要用两个驱动器? 原因有二:
1) 如果桌面直接备份到暂存驱动器,那么在某个时候,客户端桌面备份将因目标驱动器空间不足而失败。我无法预测这种情况何时会发生;我能想到的唯一可定义条件是可用磁盘空间的任意阈值,但由于要存档的备份文件大小不同,我可能会遇到目标驱动器可用空间高于阈值但下一次备份超出该空间的情况。结果:客户端桌面备份失败,服务器磁带备份无法启动。
2)如果暂存驱动器已满,并且磁带备份由于某种原因(磁带未更换或其他原因)失败,则将桌面备份到公共驱动器可以为我赢得一些时间来修复磁带问题,在桌面备份开始失败之前。
这是我正在尝试编码的算法:
1)开始
2)获取暂存驱动器上的可用空间
3)获取公共驱动器上最小文件的大小(如果没有文件,则退出)
4)将文件大小与暂存驱动器上的可用空间进行比较
5) 如果文件适合,则将其移动到暂存驱动器;否则,退出并启动磁带备份
6)返回开始
下面是我的批处理代码,但它不起作用。在测试的这个阶段,我在公共驱动器中有一个文件(8 GB),它将适合暂存驱动器上的可用空间(32 GB)。set 命令确认变量已按预期设置;该过程在语句 [ if %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
我知道这一定相当简单,但就像我说的,我不是程序员,我敬佩你的高超技能。任何建议都非常感谢,谢谢。