treedown’s Report

システム管理者に巻き起こる様々な事象を読者の貴方へ報告するブログです。会社でも家庭でも"システム"に携わるすべての方の共感を目指しています。

※https化しました。その影響でしばらくリンク切れなどがあるかもしれませんが徐々に修正していきます。 リンク切れなどのお気づきの点がございましたらコメントなどでご指摘いただけますと助かります。

deleteコマンドで足りないのでRemove-Itemを使ってみる

コマンドでファイルやフォルダを削除するとき、delコマンドを使って削除を実施するのですが、ツリー配下を一括削除するにはちょっとした工夫が必要でした。
PowerShellを使えば楽々解決するのでご報告します。

delコマンド

コマンドプロンプトで特定のフォルダ配下のファイルやフォルダを一括で削除するにはdelコマンドでパスを指定してフォルダ内のファイル削除、空っぽになったフォルダをrmdirコマンドで削除する、という二段構えが従来は必要でした。

以前にやった自動削除で検証しました。

blog.treedown.net

削除対象のディレクトリにカレントディレクトリを移動し、delとrmdirで対象の削除を実行しています。

PowerShellを使うとこんな面倒はなく、あっさり実行できるのですが、いかんせん削除というのはトラブルがつきものなので、しっかり検証していこうと思います。

Remove-Itemコマンドレット

削除につかうコマンドはPowerShellのコマンドレットでRemove-Itemといいます。

テスト環境を用意しました。

フォルダc:\tempに「テスト用サブフォルダ」と「テスト用フォルダ」の二つを用意し、その配下を以下のようにダミーのファイルを置いてこれらを一括削除してみることにします。

最初に実行してみたのは単純に

Remove-Item C:\temp\test-rm\*

とコマンドレットに対象を引数として渡してみました。

以下のような表示が出てきます。

--------------------------------------------------------------
確認
C:\temp\test-rm\テスト用サブフォルダ の項目には子があり、Recurse
パラメーターが指定されていませんでした。続行した場合、項目と共にすべての子が削除されます。続行しますか?
[Y] はい(Y)  [A] すべて続行(A)  [N] いいえ(N)  [L] すべて無視(L)  [S] 中断(S)  [?] ヘルプ (既定値は "Y"):
--------------------------------------------------------------

フォルダを対象としたときに、子オブジェクトがある場合には、上記のようなメッセージで確認をされるようです。

試しにフォルダを復元して、

Remove-Item C:\temp\test-rm\* -Recurse

とコマンドオプション「-Recurse」を付けてみると、

このように確認メッセージは表示されなくなり、

フォルダの中も綺麗に空っぽになりました。バッチスクリプトで使用するとしたら「-Recurse」は不可しておきたいオプションといえそうです。

読み取り専用ファイルを追加してみる

次に、ものは試しと読み取り専用属性を持つテキストファイルを配置してみました。

このreadonly.txtが検証用ファイルです。このファイルのプロパティで、

上図のように「読み取り専用」属性を有効化したファイルです。
この状態で

Remove-Item C:\temp\test-rm\* -Recurse

と、先ほどと同じように削除を試してみると、

「項目 C:\temp\test-rm\テスト用フォルダ\readonly.txt を削除できません: この操作を実行するために十分なアクセス権がありません。」

と、エラーになってしまいました。読み取り専用属性を持つファイルを消すには「-Recurse」だけでは足りないようです。

この場合には、「-Force」をさらに付加して実行することで、読み取り専用属性を持つファイルも含めて全て削除することができます。やってみましょう。

環境を元に戻して、読み取り専用属性を持つテキストファイルも(2ファイル)配置済です。

この状態で、

Remove-Item C:\temp\test-rm\* -Recurse -Force

と実行すると、先ほどと同じようにメッセージが表示されず、コマンドレットの実行が完了しました。

フォルダを確認しても、

しっかり削除対象が消えていることが分かります。

ちなみに、上記の処理でtest-rmフォルダそのものを削除するときには、

Remove-Item C:\temp\test-rm -Recurse -Force

と実行すると、親オブジェクトであるC:\temp\test-rmフォルダを削除対象とします。

delコマンドよりRemove-Item

Linuxだとrmコマンドで「-r」オプションを付与してディレクトリツリーの配下を削除することは簡単(※)なのですが、コマンドプロンプトのdelコマンドやrmdirコマンドはrm -rと比較すると使い勝手が悪いコマンドでした。

※)ただし、Linuxにおけるrm -rはrootで実行すると大事なファイルであっても簡単に削除できてしまうことで、使用には十分注意が必要であることは有名な話です。

Remove-Itemも同様のことが言えそうですが、不要なファイルやフォルダを削除するのがいままで手間が掛かっていたのをLinuxのrm -rのように指定したパス以下のフォルダを削除出来るのは従来より便利です。

バックアップの取得の時にプリ・ポストコマンドなんかで古いバックアップデータを消すときに使えそう。これからファイルやフォルダを削除するときはRemove-Itemを覚えておくようにします。