背景
色々ありまして。
やりたいこと
.
├── directoryA ←消す
├── directoryB ←残す
│ ├── fileB-1.txt ←残す
│ └── fileB-2.txt ←残す
├── directoryC ←消す
環境
$PSVersionTable
Name Value
---- -----
PSVersion 5.1.18362.752
PSEdition Desktop
PSCompatibleVersions {1.0, 2.0, 3.0, 4.0...}
BuildVersion 10.0.18362.752
CLRVersion 4.0.30319.42000
WSManStackVersion 3.0
PSRemotingProtocolVersion 2.3
SerializationVersion 1.1.0.1
Remove-Item -Exclude -Recurseでできるのでは?
出来なかったです。試してみたところ、確かに-Exluceで除外指定したディレクトリは削除されませんが、除外指定したディレクトリの配下のファイルが削除されてしまいます。
Remove-Item -Path "." -Exclude "directoryB" -Recurse -Force
.
├── directoryA ←消える
├── directoryB ←残る
│ ├── fileB-1.txt ←消える
│ └── fileB-2.txt ←消える
├── directoryC ←消える
なんで?
仕方ないので、Get-ChildItemを使うことにします。
Get-ChildItemで削除対象を絞り込む
Get-ChildItem -Path "." -Exclude "directoryB" | Remove-Item -Recurse -Force
.
├── directoryA ←消える
├── directoryB ←残る
│ ├── fileB-1.txt ←残る
│ └── fileB-2.txt ←残る
├── directoryC ←消える
こうすると、directoryBとその配下は残しつつ、他のアイテム(ディレクトリとファイル)を削除可能です。
ちなみに-whatifオプションを指定すると、削除結果をシミュレーションできます。
テストのためになんども実ファイルを作るのは面倒なので、ありがたいですね。
まとめ
Remove-ItemのRecurseオプションは、直感と異なる動作をしますね、、、
参考
Exlcludeオプションで指定するディレクトリは、外部ファイルから読みこむ方法も取れます。