2016-02-05 60 views
0

我不能想出一个办法来递归删除除每个文件夹中的子子目录中称为“广播”电源外壳卸下项递归子目录3级下调

Dir 
->subdir1 
-->main 
-->broadcast 
->subdir2 
-->main 
-->broadcast 
->test 

我想所有的文件夹保留所有subdir#\广播文件夹和测试文件夹。 问题与下面这段代码是,这消除在以下几个递归subdir1和subdir2,从而消除分次目录

Get-ChildItem -Path $copy_file -Recurse | 
Select -ExpandProperty FullName | 
Where {$_ -notlike '*broadcast\*' -and $_ -notlike '*testing*'} | 
sort length -Descending | 
Remove-Item -force 

,因为这个名单,我得到我的时候我排序不能使用-force/A包括subdir1和subdir2 ...

It does prompt me "This item has children..." 
[Y] Yes [A] Yes to all... [L] No to all 

我不希望它自动选择L

有什么建议?预先感谢您......我看过但找不到我正在寻找的确切解决方案。

+1

你应该有2个循环。首先获取'$ copy_file'的直接子元素(而不是递归)。从你的问题你不想删除任何这些。然后为每个文件夹运行他们的孩子的第二个循环。从他们的过滤。在'Get-ChildItem'中使用'-Directory'也应该有帮助。 – Matt

+0

好主意马特,唯一的问题是我有X量的子目录:( –

+0

可能重复的[删除所有文件和文件夹,但排除目录](http://stackoverflow.com/questions/14775672/delete-all-files-和 - 文件夹,但不包括一个目录) – user4317867

回答

0

这将排除“广播”文件夹(你可以用你代替),然后您可以传递对象到删除项

Get-ChildItem -Path D:\ -Recurse -Exclude @('broadcast') -Directory | ForEach- Object($_){ 
Write-Host $_.FullName 
} 
+0

谢谢你的答案,我忘了提及它是为PS 2.0 ... 4.0的东西 - 目录或foreach不存在:( –

0

这将完成的导航顶部路径$copyfile拉所有的孩子目录。不是递归只是直接的孩子。对于这些孩子中的每一个,我们将用广播名称过滤掉所有文件夹。那些仍然存在的问题,将其删除

Get-ChildItem -Path $copy_file -Directory | ForEach-Object{ 
    Get-ChildItem -Directory -Path $_.FullName | Where-Object{$_.Name -ne "broadcast"} | Remove-Item -Force -WhatIf 
} 

您可能需要添加-RecurseRemove-Item我离开-WhatIf那里,所以你可以测试。

+1

我认为这是最好的做法来过滤管道的LEFT,因为它更高效,例如使用'Get-ChildItem'和'Exclude'参数 – user4317867

+1

@ user4317867非常正确,我试图给出一个给出目录结构的基本示例。一个好主意当你不使用递归时,Exlcude并不总是按预期工作,所以这是一个预防措施,并且结构看起来并不涉及。 – Matt

+0

上面不会试图去除subdir1和subdir2吗?菜单,我不能让它选择“L”(不是所有的) –