删除除一个子文件夹及其中的文件之外的所有文件

删除除一个子文件夹及其中的文件之外的所有文件

请看这个例子:

  • 文件夹1
    • 文件夹1
    • 文件夹2
    • 文件夹3
    • 文件夹4
  • 文件夹2
    • 文件夹1
    • 文件夹2
    • 文件夹3
    • 文件夹4
  • 文件夹3
    • 文件夹1
    • 文件夹2
    • 文件夹3
    • 文件夹4
  • 文件夹4
    • 文件夹1
      • 文件夹1
      • 文件夹2
      • 文件夹3
      • 文件夹4
    • 文件夹2
    • 文件夹3
    • 文件夹4

我想删除层次结构之外的所有内容以及 folder4/folder1/folder2/* 下的内容,如下所示:

  • 文件夹4
    • 文件夹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

相关内容