Defragmentation is a great way to keep workstations and servers running at
their best performance. Windows Server 2003 comes with a defragmenter: dfrgntfs.exe.
However, you can't automate this defragmenter unless you purchase a program
such as Diskeeper. I didn't have money for such a program in my budget, so I
created and scheduled a batch file named Defrag.bat.
As Listing 1 shows, Defrag.bat is a simple
program. It uses the defragmenter's command-line interface (defrag.exe) to run
the defragmenter against each drive. However, I wasn't happy with Defrag.bat
for two reasons. First, I had to let the batch file run while being left logged
on with my administrator ID. Although I locked the screen for security reasons,
I didn't want to leave myself logged on all the time. Second, I wanted more
automation.
So, I did some digging around and found a means to automate the procedure.
I found that I could use the Windows scheduler but in a different way that I
didn't know was possible: I could use the AT command with a batch file.
I created a new batch file, Defrg. bat, which Listing
2 shows. Like Defrag.bat, Defrg.bat runs defrag.exe. However, Defrg.bat
has a few more features than Defrag.bat. I included code that documents when
the defragmenter starts and ends in a log file. I also added code that ports
the defragmenter's screen output to the same log file (with some titles in between)
to record which drives are being defragmented. That way, I can easily check
to see whether the defragmentation operation ran and whether any errors occurred.
To use the new script, I log on to the server with my administrator ID, open
a command-shell window, and run command
at 08:00pm /every:M,T,W,Th,F
f:\Defrg.bat
(Although this command appears on several lines here, you would enter it on
one line in the command-shell window.) This command creates a new scheduled
item in Scheduled Tasks that runs Defrg.bat every weeknight at 8 p.m. (which
is before our backup runs).
With this new batch file, I don't need to be logged on for it to run. Because
Defrg.bat is running as a system process, the defragmentation operation is performed
in the background (i.e., no window comes up), but Task Manager will show that
defrag.exe and dfrgntfs.exe are running. After Defrg.bat finishes, the scheduler
will show 0x0 for a successful execution. However, I always check the log file
to make sure no problems were encountered.
To use Defrg.bat, you simply need to replace f:\defrag.log in the code at callout
A in Listing 2 with the pathname to your
log file. The AT command and batch file work on Windows Server 2003, Windows
XP Professional, and Windows XP Home Edition. I recommend that you make the
batch file a read-only, hidden file. That way, no one can edit it so that it
damages your computers when the scheduled batch runs.
—Daniel L. Gillard
See Associated Figure