Server Fault is a question and answer site for system and network administrators. It's 100% free, no registration required.

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

update SOLVED - the problem is not with my code. there is a design limitation (some might say "bug") in the command processor. the IF comparison operators do not work with values higher than 2147483648. tested and replicated on Windows 2000, XP, and Server 2003.

now I just have to figure out how to strip off some of the least significant digits for the workaround. thanks to all for reading.


hello out there in cyberland,

I manage a small company's network. I'm trying to set up an automated archival process using a batch file running on a server, and need a little help with the logic. I'm not a programmer and don't have the time to learn PowerShell or VBscript. I have read and re-read the MS command reference on IF, FOR, and CALL, and can not figure out what I'm doing wrong.

We have a Windows 2000 Server with two disk drives and a tape drive. One disk has a shared folder, call it Public; the other disk is not shared, call it Staging.

The Public drive will accept incoming backups from the client desktops. I need the process to move files from the Public drive to the Staging drive until the drive is too full to accept any more files, whereupon the tape backup starts. Upon completion of the tape run, the Staging drive will be emptied and the process will resume moving files from Public to Staging.

The goal is to automatically and perpetually archive the desktop backup files to tape, with no user intervention other than changing the tape.

You may ask, why involve two drives? Two reasons:

1) If the desktops back up directly to the Staging drive, at some point the client desktop backups will fail for lack of space on the target drive. I have no way to predict when this will occur; the only definable condition I can think of would be an arbitrary threshold of free disk space, but since the backup files to be archived will be different sizes, I could run into a situation where the target drive free space is above the threshold, but the next backup exceeds that space. Result: client desktop backup fails and server tape backup does not start.

2) If the Staging drive fills up and the tape backup fails for some reason (tape not changed or whatever), having the desktops back up to the Public drive buys me some time to fix the tape issue before the desktop backups begin to fail.

Here is the algorithm I'm trying to code:

1) Begin

2) Obtain free space on Staging drive

3) Obtain size of smallest file on Public drive (if no files present, exit)

4) Compare file size with free space on Staging drive

5) if file will fit, move it to Staging drive; else, exit and start Tape Backup

6) return to Begin

And here is my batch code which is not working. At this stage in testing, I have one file (8 GB) in the Public drive which will fit in the free space (32 GB) on the Staging drive. The set command confirms the variables are being set as expected; the process is failing at the statement [ if %BKFsize% LSS %DiskFree%" ]. Instead of the file being moved, the tape routine specified by 'else' is called instead:

@echo off
setlocal enableextensions enabledelayedexpansion
REM   obtain and display free space on Staging drive.
for /f "tokens=3 delims= " %%A in ('dir ^| find "bytes free"') do (
set Z=%%A
set Z=!Z:,=!
set DiskFree=!Z!
echo D: has %DiskFree% bytes free
REM   obtain sizes of files on Public drive to be moved.
cd \
if not exist *.bkf exit
dir *.bkf /b /os > BKFlist.txt
for /f "tokens=*" %%G in (BKFlist.txt) do call :CheckBKF "%%G"
goto :eof
set BKFfile=%1
set BKFsize=%~z1
echo File %BKFfile% is %BKFsize% bytes
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
move E:\\%BKFfile% D:\
) else (
goto Begin

I know this must be fairly simple but like I said, I'm not a programmer, and I bow to your superior skill. Any advice is much appreciated, and thank you.

share|improve this question
What are the values of BKFsize and DiskFree? I.e., can we see the sample output of a failed run? – Andrew M. Mar 25 '11 at 20:52
thanks; there is no output as such. I have a SET statement right before the problem code that confirms the expected values; they are integers. – user75900 Mar 25 '11 at 21:01
Since it could be the order you're comparing them is not correct, would it be possible for you to actually list the values? – Andrew M. Mar 25 '11 at 21:10
thanks; here is the output of SET (irrelevant vars omitted):<br>D: has 32635236352 bytes free File "test1.bkf" is 8620327936 bytes BKFfile="test1.bkf" BKFsize=8620327936 DiskFree=32635236352 Z=32635236352 – user75900 Mar 25 '11 at 21:18

Your Answer


By posting your answer, you agree to the privacy policy and terms of service.

Browse other questions tagged or ask your own question.