社内SEの徒然なる日記

PowerShellで再帰的なファイル削除の検証

■ Remove-Item

PowerShellで、あるフォルダ内の特定のファイルを除いて削除したいと思いRemove-Itemコマンドレットを使ったのですが、思うように動きません。
どうやら、パラメータ「Exclude」の使い方に問題があるようです。

まず、フォルダ構成はこんな感じとします。
D:\AssetsDiff
│ ★ReadMe★.txt
│ コピー ~ ★ReadMe★.txt

└─aaaa
★ReadMe★.txt
コピー ~ ★ReadMe★.txt


やりたいのは、このAssetsDiffフォルダにある「★ReadMe★.txt」を除いた全てを削除したいのです。

先に答えを書くと、こうです。
Remove-Item 'D:\AssetsDiff\*' -Exclude '★ReadMe★.txt' -Recurse -Force


-Excludeパラメータで削除の除外対象を指定、-Recurseパラメータで子要素も対象、-Forceパラメータで読み取り専用ファイルとかも対象。これだけですね。

結果は、こうなりました。
D:\AssetsDiff
★ReadMe★.txt


■ -Exclude パラメータの動作

私が最初に間違えた方法ってのが、これになります。
Remove-Item 'D:\AssetsDiff\*' -Exclude 'D:\AssetsDiff\★ReadMe★.txt' -Recurse -Force


-Excludeパラメータを絶対パスで指定していたんです。Remove-ItemコマンドレットのExcludeパラメータは、単純に指定された文字を条件として使用するようなんです。

結果どうなるかというと、「D:\AssetsDiff」配下の全てが削除されました。まぁ、それはそれで良いのですが、気に入らないのはサブフォルダへの影響です。

最初のフォルダ構成を見直して欲しいのですが、この時の除外条件は「★ReadMe★.txt」なのですが、これと同じ名前のファイルが、サブディレクトリの「aaaa」フォルダにも存在しています。

最初に絶対パスで指定したのは、単純に「★ReadMe★.txt」を除外すると、サブフォルダ「aaaa」配下の「★ReadMe★.txt」の存在を検知して、これが残ったままになるのではないかと思ったのです。

ところが、残したかった直下の「★ReadMe★.txt」まで消される始末です。

要は、Remove-ItemコマンドレットのExcludeパラメータは、サブフォルダまで影響しないっていう仕様。故に、パスの指定は出来ないって考えなんですかね。

■ 再帰的な削除

では、指定したファイルを除いてのサブフォルダ内のファイルを一括削除するにはどうするかって事なんですが、ここはパイプラインを使う事で何とかなるようです。

Get-ChildItem -Path $DiffDIR -Recurse -Exclude '★ReadMe★.txt' | Where-Object {$_.GetType().Name -ne "DirectoryInfo" } | Remove-Item -Force -Recurse

まず、Get-ChildItemコマンドレットで「★ReadMe★.txt」を除くフォルダ構造を取得します。同じExcludeパラメータでも、Get-ChildItemコマンドレットの場合はサブフォルダまで影響するので、「aaaa」フォルダ配下の「★ReadMe★.txt」は除外してくれます。

ただし、この結果にはフォルダ自体が含まれているので、このままだと「aaaa」フォルダ自体が削除されてしまいます。そこで、Where-Objectコマンドレットを使用してフォルダを除外します。

ここまで絞り込んだ結果をRemove-Itemコマンドレットに渡すことで、「★ReadMe★.txt」以外の全ファイルを削除することが出来ました。
D:\AssetsDiff
│ ★ReadMe★.txt

└─aaaa
★ReadMe★.txt


■ 残った問題

結局解決できなかったのは、「指定したファイル、及びそれが存在するフォルダ以外を削除する」っていう事です。ファイルだけなら↑の手順で良いのですが、フォルダが含まれた場合、これが残っちゃいますよね。

まぁ、ガリガリと作りこめばどうとでもなりますが、できればガリガリしないで何とかしたいものです。PowerShellから別のコマンドを発行するって手もあるかと思ったのですが、なんか美しくないし、何とかPowerShellのコマンドレットだけで何とかならないものでしょうかね。

まぁ、現状では必要性がないので、どこかで必要になった時に真剣に考えますか。


投稿記事の一覧:http://harikofu.web.fc2.com/

--- blog end ---

スポンサードリンク

PageTop

コメント


管理者にだけ表示を許可する