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