Windows TIPS
[System Environment]
Tips   Windows TIPS TOPへ
Windows TIPS全リストへ
内容別分類一覧へ

使用中のファイルをmovefileコマンドで次回起動時に削除する

解説をスキップして操作方法を読む

デジタルアドバンテージ 打越 浩幸
2012/07/13
対象OS
Windows XP
Windows Server 2003
Windows Vista
Windows Server 2008
Windows 7
Windows Server 2008 R2
Summary
ファイルやフォルダを削除しようとしても、使用中やアクセス権の問題などによって削除できないことがある。
このような場合は、Sysinternalsのmovefileコマンドでファイルを移動/削除させるとよい。
このコマンドで指定されたファイルは、次回のシステム起動時に移動/削除される。

解説

 エクスプローラの削除メニュー([Del]キー)や、コマンド・プロンプト上のdel/rmdirコマンドなどを使ってファイルやフォルダを削除しようとしても、何らかの理由で拒否されることがある。たとえ管理者権限でログオンしていても、である。

 ほとんどの場合、ファイルやフォルダが削除できない理由は、「誰か」がそのファイルやフォルダにアクセスしていたり、オープンしていたりするからである。「誰か」とは、例えばシステム・プロセスやサービスであったり、ほかのユーザー(のプログラム)であったりする。

C:\>cd /d %TMP% ……TMPフォルダへ移動する

F:\TMP>rmdir /s .  ……この中を全部削除してみる
.、よろしいですか (Y/N)? y ……確認。「y」を入力する
.\Perflib_Perfdata_790.dat - プロセスはファイルにアクセスできません。別のプロセスが使用中です。 ……削除できないファイルがある
プロセスはファイルにアクセスできません。別のプロセスが使用中です。

 これらの事情を分かったうえで、それでも強制的にファイルを削除したい場合は、エクスプローラの削除機能やdelコマンドなどの代わりに、Sysinternalsのmovefile.exeコマンドを使うとよい。これはファイルを移動/削除させるコマンドであるが、すぐに実行されるわけではなく、次回システムを起動したときに実行させるコマンドである。実はこれはWindows OSが持つ、「システム起動時に、ファイルの名前(パス)を変更したり、削除したりする機能」に登録するためのコマンドだ。内部的にはMoveFileExというAPIを使用している(次のサイト参照)。

 Windows OSにService Packや修正プログラムを適用する場合、すぐに適用してしまっては現在実行中のシステムやアプリケーションなどが動かなくなる可能性がある。そこでこれらのインストーラでは、ファイル置き換え/削除の要求をレジストリ中の特定の場所に「登録」しておき、次回システム起動時に実際の処理を行うようになっている。システム起動時にはまだサービスやWindows OSカーネル・モジュール、ドライバなどが起動していないため、ファイルの削除や更新などが実行できるというわけだ(その仕組み上、すべてのファイルやフォルダを削除できるわけではない。いくつかのシステム・ファイルなどは使用中のため、やはり削除できない)。

 movefileコマンドは、指定されたファイルをこの移動要求リストに登録する機能を持つ。またpendmoves.exeというコマンドは、現在登録されているリストを表示する機能を持つ。本TIPSではこれらのコマンドを紹介する。

  操作方法

 Sysinternalsのmovefileとpendmovesコマンドは以下のリンクから入手できる。

 ここからPendMoves.zipファイルをダウンロードし、適当なフォルダへ解凍して、実行パスを通しておく。

movefileコマンドでファイルを削除する

 movefileコマンドの使い方は次の通りである。

C:\>movefile /? ……ヘルプの表示

Movefile v1.0 - copies over an in-use file at boot time
usage: movefile [source] [dest]

Specifying an empty destination ("") deletes the source at boot.

 引数として、移動元のファイルと移動先を指定するだけである。移動元としてファイルやフォルダを指定できるが、ワイルドカードは使えない。必ず1つずつファイル/フォルダ名を指定する。

 移動先を指定すると、そのフォルダへファイルが移動するが(もしくは名前の変更になるが)、空の文字列「 "" 」を指定すると、移動/名前変更ではなく削除になる。

F:\TMP>movefile "cdstmp_3092_4" ""  ……このファイルを削除する

Movefile v1.0 - copies over an in-use file at boot time
Move successfully scheduled.


F:\TMP>movefile "f:\tmp\vmware-SYSTEM" "" ……フォルダも削除してみる。これは使用中のため、rmdir /sでは削除できなかった

Movefile v1.0 - copies over an in-use file at boot time
Move successfully scheduled.


F:\TMP>movefile "cdstmp_*" "" ……ワイルドカード指定は不可

Movefile v1.0 - copies over an in-use file at boot time
Error: 123 ……エラー123。このメッセージの意味は「net helpmsg 123」などで検索可能

F:\TMP>

 movefileコマンドの実行後、システムを再起動するまで、指定したファイルは移動も削除もされない。これは対象ファイルが即座に移動/削除できてもできなくても変わらない。実際に処理されるのは再起動後である。

pendmovesコマンドで移動/削除されるファイルを確認する

 movefileコマンドで移動/削除を指示したファイルは、pendmoves(pending move)コマンドで確認できる。このコマンドには引数はなく、単に実行するだけでよい。

F:\TMP>pendmoves ……pendmovesコマンドで確認する。インストーラなどで登録されている項目も表示される

PendMove v1.1
Copyright (C) 2004 Mark Russinovich
Sysinternals - wwww.sysinternals.com

Source: C:\Windows\SysWOW64\Macromed\Flash\Flash32_11_3_300_257.ocx
Target: DELETE ……削除される予定を表している。これはflash Playerのインストーラによって削除予約されたファイル

Source: C:\Windows\SysWOW64\Macromed\Flash\FlashUtil32_11_3_300_257_ActiveX.exe
Target: DELETE

Source: F:\TMP\B115.tmp
Target: f:\TEMP ……移動される予定を表している。これは移動先のフォルダ名

Source: F:\TMP\dd_vcredistMSI2133.txt
Target: DELETE

Source: F:\TMP\cdstmp_3092_4 ……先ほど削除指定したファイル
Target: DELETE

Source: f:\tmp\vmware-SYSTEM ……先ほど削除指定したフォルダ
Target: DELETE

Time of last update to pending moves key: 2012/07/10 16:15

 先ほどmovefileで指定したファイル以外にも、プログラムのインストーラや修正プログラムなどによって登録された項目も表示されている。

移動/削除の実行

 movefileでファイルの移動や削除を登録したら、あとはシステムを再起動するだけである。すると次回起動時に自動的にファイルが処理され、登録済みの項目も削除される(pendmovesの結果は空になるし、ごみ箱にも残らない)。End of Article

「Windows TIPS」


Windows Server Insider フォーラム 新着記事
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Windows Server Insider 記事ランキング

本日 月間