请看这个例子:
- 文件夹1
- 文件夹1
- 文件夹2
- 文件夹3
- 文件夹4
- 文件夹2
- 文件夹1
- 文件夹2
- 文件夹3
- 文件夹4
- 文件夹3
- 文件夹1
- 文件夹2
- 文件夹3
- 文件夹4
- 文件夹4
- 文件夹1
- 文件夹1
- 文件夹2
- 文件夹3
- 文件夹4
- 文件夹2
- 文件夹3
- 文件夹4
- 文件夹1
我想删除层次结构之外的所有内容以及 folder4/folder1/folder2/* 下的内容,如下所示:
- 文件夹4
- 文件夹1
- 文件夹2
- 文件1
- 文件夹2
- 文件夹1
所以我尝试了:
((Get-ChildItem ./root/ -recurse | select -ExpandProperty fullname | Resolve-Path -Path {$_} -Relative)-notlike '.\folder4\folder1\folder2*') | Remove-Item -verbose -Recurse
这删除了根目录下的所有内容,我不明白为什么,因为如果我在 Remove-Item 之前显示我的选择结果,我就有想要删除的内容。
答案1
问题是在某个时候,folder4 和 \folder4\folder1\ 被删除,并且扩展名为 \folder4\folder1\folder2*
我的解决方案是使用以下内容:
((Get-ChildItem ./root/ -recurse | select -ExpandProperty fullname | Resolve-Path -Path {$_} -Relative)-notlike '.\root\folder4' -notlike '.\root\folder4\folder1\' -notlike '.\root\folder4\folder1\folder2\*' ) | Remove-Item -Recurse
我认为这不是最干净的方法,但它有效。
答案2
如果您只想保留一个路径及其文件,则选择不属于排除路径的所有目录并将它们通过管道传输到Remove-Item
其中一种方法:
$RelativeExclusionPath = 'folder4\folder1\folder2'
$ExcludePath = ( Resolve-Path $RelativeExclusionPath ).Path
Get-ChildItem ./root/ -Directroy -Recurse |
Where { $ExcludePath -notMatch ( [regex]::Escape(( $_.FullName )) } |
Remove-Item -Recurse -ea silent
根目录中的文件必须单独删除。
如果您想要保留整个文件夹层次结构,而不仅仅是排除的路径及其祖先,请使用参数-File
仅选择文件。然后根据文件的DirectoryName
属性过滤这些文件:
$ExcludePath = ( Resolve-Path 'folder4\folder1\folder2' ).Path
Get-ChildItem ./root/ -File -Recurse |
Where DirectoryName -notLike $ExcludePath |
Remove-Item