使用目录名称上的筛选器递归删除文件和目录

时间:2017-01-05 20:08:38

标签: powershell recursion directory

我试图根据指定所需目录/子目录名称的过滤器删除所有目录,子目录及其中包含的文件。

例如,如果我有c:\ Test \ A \ B.doc,c:\ Test \ B \ A \ C.doc,c:\ Test \ B \ A.doc,我的过滤器指定所有目录命名' A',我希望剩下的文件夹和文件分别是c:\ Test,c:\ Test \ B和c:\ Test \ B \ A.doc。

我试图在PowerShell中执行此操作并且不熟悉它。

以下两个示例将删除与指定过滤器匹配的所有文件,但也会删除与过滤器匹配的文件。

$source = "C:\Powershell_Test" #location of directory to search
$strings = @("A")
cd ($source);
Get-ChildItem -Include ($strings) -Recurse -Force | Remove-Item -Force –Recurse

Remove-Item -Path C:\Powershell_Test -Filter A

2 个答案:

答案 0 :(得分:2)

我会用这样的东西:

$source = 'C:\root\folder'
$names  = @('A')

Get-ChildItem $source -Recurse -Force |
  Where-Object { $_.PSIsContainer -and $names -contains $_.Name } |
  Sort-Object FullName -Descending |
  Remove-Item -Recurse -Force

Where-Object子句将Get-ChildItem的输出限制为只有名称在数组$names中的文件夹。按其全名按降序对其余项目进行排序可确保子文件夹在其父项之前被删除。这样就可以避免尝试删除先前的递归删除操作已删除的文件夹时出现错误。

如果你有PowerShell v3或更新版本,你可以直接使用Get-ChildItem进行所有过滤:

Get-ChildItem $source -Directory -Include $names -Recurse -Force |
  Sort-Object FullName -Descending |
  Remove-Item -Recurse -Force

答案 1 :(得分:1)

我认为你不能那么简单地做到这一点。这将获取目录列表,并将路径分解为其组成部分,并验证过滤器是否与其中一个部分匹配。如果是这样,它将删除整个路径。

如果由于嵌套(测试路径)已经删除了目录,它会稍加谨慎处理,并且-Confirm有助于确保如果此处存在错误,您有机会验证行为。

$source = "C:\Powershell_Test" #location of directory to search
$filter = "A"
Get-Childitem -Directory -Recurse $source | 
    Where-Object { $_.FullName.Split([IO.Path]::DirectorySeparatorChar).Contains($filter) } |
    ForEach-Object { $_.FullName; if (Test-Path $_) { Remove-Item $_ -Recurse -Force -Confirm } }