Keeping disks defragmented
I want to keep my disks defragmented, with these constraints:
· Don’t consume the disk IO resources while I’m working
· Don’t make me remember to launch defrag before I go home
· Defrag all my disks, not just one (Windows defragger only does one at a time)
· Work correctly even if I run as normal user
To support this, I wrote a small script to run the defragger. Here it is:
@if "%_Echo%" == "" echo off
if "%1" == "" goto Usage
:next
cd /d %1\
echo defragmenting %1 > defrag.log
defrag -v -f %1 >> defrag.log 2>&1
shift
if NOT (%1) == () goto next
goto :EOF
:Usage
echo pass volumes on the command line:
echo.
echo %~n0 c: d: c:\mount_point
goto :EOF
I’m known for writing confusing batch files, so let’s go through it:
@if "%_Echo%" == "" echo off
Turn off echo by default. If you want to see echo output, ‘set _echo=1’.
cd /d %1\
The ‘/d’ option means change the current drive, too. (Should be the default, but hard to change now.)
defrag -v -f %1 >> defrag.log 2>&1
Run the defragger. ‘-v’ means generate verbose output about the number of fragmented files before & after, etc. Redirect it all to defrag.log, which will be (normally) be written to the root of the drive.
shift
if NOT (%1) == () goto next
Repeat for each parameter.
goto :EOF
exit the batch script. (If you use ‘call :label’ then just exit this instance).
echo %~n0 c: d: c:\mount_point
%~n0 means ‘just the base name of the current batch file’.
Next, add a scheduled task:
Control Panel -> Scheduled Tasks
File->New->Scheduled Task (Don’t use the Add Scheduled Task wizard)
Give it a name (“defrag”).
RClick, Properties:
- Set the schedule as it suits you. I told it to abort my job after 1 hour, just in case something is really broken.
- OK. You’ll be prompted for local admin credentials
Now you’ll have a new task in the scheduled tasks list. Time to verify it.
RClick on the task, Run
Watch its ‘Status’ change. You want it to say ‘Running’ for at least a minute. Anything else & something is broken. Take a look at Advanced->ViewLog for clues.
The first time this ran, it was aborted after an hour. The next night it ran again & completed. I think I’ll leave it like that.
Comments
Anonymous
July 19, 2004
This is by far one of the most useful blog posts I've ever read!Anonymous
July 19, 2004
I would have to second that. Absolutely brilliant jay.
How big are your hard drives?
wink winkAnonymous
July 19, 2004
The comment has been removedAnonymous
July 19, 2004
You may want to add an additional defrag statement - just with the drive and -b
-b is "not documented" and will not show any output - even with -v. it moves those start up executeables to the beginning of the disk.
rumors say XP does it every other day itself - but just to be sure :-)Anonymous
July 20, 2004
Another option, which I've been using for a few years now, is diskeeper (http://www.execsoft.com) which meets all your criteria and more. My favourite feature is that it monitors your drives and will kick off a small defrag when it feels it needs to, at idle priority so it doesn't impact what you're doing.
It has other fun things like boot time defragging for those hard to reach files, but I use them rarely. Highly recommended.
(not a paid shill for execsoft, though if they want to throw me a free upgrade when the new version comes out, they can :)Anonymous
July 20, 2004
I'm surprised & happy to hear that this post has been so valuable to you. Cheers.Anonymous
July 20, 2004
calling all CS peopleAnonymous
July 20, 2004
http://martnet.com/~jfosler/Anonymous
July 21, 2004
Excellent! I'm copying+pasting into notepad right now. More more!Anonymous
July 23, 2004
defrag trukkAnonymous
July 23, 2004
Automated Defrag for Windows XPAnonymous
July 28, 2004
From the doh! department: be sure to not call your defrag command file c:defrag.cmd.
It'll hide the defrag.exe and you'll end up in a recursive loop with a very large log file...Anonymous
May 17, 2008
PingBack from http://janiah.freeindiamusiconline.info/defragwhileworking.htmlAnonymous
June 15, 2009
PingBack from http://mydebtconsolidator.info/story.php?id=6692