Contigを使って定期的にデフラグするように設定した

デフラグ重要

私は仕事でWindows XPを使っています。最近、妙に動きが遅いと感じていました。ふとデフラグツールで確認してみたところ、ハードディスクのフラグメントが非常に進んでいることがわかりました。そこで、デフラグしたところ、動作が速くなり、快適になりました。

私はデフラグすること忘れてしまいがちで、知らず知らずのうちにパソコンが遅くなっていることが多くあります。Windows Vistaでは、週に1回、自動的にデフラグが実行されます。私が使っているWindows XPでも、週に1回、自動的にデフラグが実行されるようにしようと考えました。

Contigというデフラグツールがある

デフラグをかける場合、ハードディスク全体にかけると時間がかかります。VirtualPCの仮想ハードディスクなどの巨大なファイルは除外したいと考えていました。調べてみたところ、Contigというプログラムがあり、特定のフォルダや特定の拡張子など、選択的にデフラグできることがわかりました。

contigツールでファイルを個別にデフラグする − @IT

このContigを使い、プログラムの実行にかかわりの深いファイル(*.exeと*.dll)だけデフラグしようと考えました。

Contigを使ってデフラグするスクリプト

まず、次の場所にある*.exeと*.dllだけにデフラグをかけるスクリプトを作成しました。

  • ウィンドウズのシステムフォルダ
  • Program Files
  • マイドキュメントにあるプログラムフォルダ

マイドキュメントにあるプログラムフォルダというのは、インストール不要のプログラムを私が格納している場所です。

auto_contig.cmd:

@echo off
rem defrag with contig only executable files.

set CONTIG="C:\Documents and Settings\maru\My Documents\program\Contig\Contig.exe"

call :contig_executable_files "%WINDIR%"
call :contig_executable_files "%ProgramFiles%"
call :contig_executable_files "%HOMEDRIVE%%HOMEPATH%\My Documents\program"
goto :EOF

:contig_executable_files
call :contig "%~1\*.exe" "%~1\*.dll"
exit /b

:contig
%CONTIG% -s %*
exit /b

タスクで実行する(失敗)

このバッチファイルをWindowsのコントロールパネルにあるタスクで実行します。次の条件で実行することを考えます。

  • 実行時のウィンドウは最小化する
  • 他のプロセスよりも低い優先度で実行する

これらはstartコマンドに次のオプションをつけることで実現できます。

/min /low

コントロールパネル>タスクの「スケジュールされたタスクの追加」を実行し、新しいタスクに次のように記入しました。

start /min /low auto_contig.cmd

また、「開始」に、auto_contig.cmdが置かれているディレクトリを記入しました。実行してみると、状態が「開始できませんでした」になりました。startが実行できなかったようです。どうやらstartはcmd.exeに含まれるサブコマンドらしく、単体では実行できない(start.exeやstart.comが存在しない)ようです。
そこで、次のようにcmdを付けました。

cmd /c start /min /low auto_contig.cmd

“/c”は実行後にコマンドプロンプトを終了するためのオプションです。実行したところ、最小化されたコマンドプロンプトでauto_contig.cmdが実行されました。しかし、実行が終了しても、コマンドプロンプトは閉じませんでした。ここは自動で閉じて欲しいところです。

タスクで実行する(成功)

startはバッチファイルの実行の際、新しいコマンドプロンプトを開きます。上記でcmdに“/c”オプションを付けましたが、これはstart自体が自動で終了する意味となり、新しいコマンドプロンプトは終了しません。
バッチファイルの実行後にコマンドプロンプトを終了するには、startに渡すコマンドリストの頭にも“cmd /c”をつける必要があるようです。というわけで、次のように書きました。

cmd /c start /min /low cmd /c auto_contig.cmd

これでうまく動くようになりました。それぞれの意味は以下の通りです。

記述 目的・意味
cmd startを実行するために必要
/c startの実行後にコマンドプロンプトを閉じる
start 優先度などを指定してプログラムを実行する
/min プログラムのウィンドウを最小化する
/low プログラムの優先度を「低」にする
cmd /c バッチファイルの実行後にコマンドプロンプトを閉じる
auto_contig.cmd 実行するバッチファイル名

なお、実行時には最小化されるのとは別のコマンドプロンプトが一瞬だけ表示されます。表示されない方がいいですが、そのための方法がわからなかったのと、一瞬だけなので、気にしないことにしました。表示しない方法を知っている方がいましたら教えてください。

バッチファイルの文法についての参考ページ

バッチファイルについて、非常にわかりやすく、よくまとまっているページを発見しました。
バッチメモ(Hishidama's bat-file Memo)
このページのおかげで、バッチファイル内でのサブルーチンコールの方法を知ることができました。ありがとうございます。