如何在递归搜索中排除某些文件夹

时间:2016-10-05 16:01:28

标签: powershell

我有一个脚本,它将递归搜索网络路径并提取文件名。但是,前5个文件夹需要从搜索中排除,因为它已被弃用,但尚未删除它们(我无权删除文件夹)。

我需要做的是排除一些名为- BOOT MEDIA1_Do_not_use1_lync以及其他文件夹的文件夹。

如何递归搜索目录并从搜索中排除正确的文件夹?

到目前为止我所拥有的:

param(
  [string]$gather = "PACKAGE"
)

function say($info){ Write-Host $info }

function searchDir($path = "<removed for security>") 
{ 
    foreach ($item in Get-ChildItem $path)
    {

        $package = Test-Path $item.FullName -PathType Container

        if ($package) 
        {
            $item 
            searchDir $item.FullName
        } 
        else 
        { 
            $item
        }
    } 
}

目录图片:

Directory

图像显示从答案给出的输出:

output

1 个答案:

答案 0 :(得分:1)

排除可能以递归方式存在的弃用文件夹,PS2.0 +:

function searchDir($path = "<removed for security>") 
{
    $deprecated = '- BOOT MEDIA', '1_Do_not_use', '1_lync'
    Get-ChildItem $path | ForEach {
        if ($_ -is [IO.FileInfo]) {
            $_
        } elseif ($deprecated -notcontains $_.Name) {
            $_
            searchDir $_.FullName
        }
    }
}

更快的.NET4 +版本只输出完整的文件名,而不是对象 这些目录最后有\,因此很容易辨别。

function searchDir($path = "<removed for security>") 
{
    $deprecated = '- BOOT MEDIA', '1_Do_not_use', '1_lync', 'default'
    [IO.Directory]::EnumerateFiles($path)
    [IO.Directory]::EnumerateDirectories($path) | ForEach {
        if ($deprecated -notcontains $_.Name) {
            "$_\"
            searchDir $_
        }
    }
}

另一种方法是用一个Get-ChildItem枚举所有内容,然后从结果中过滤掉已弃用的文件夹,但由于网络访问速度慢,我避免了不必要的枚举,转而支持自递归函数也被OP使用。

重要提示。

现在该功能是管道友好的,因此可以通过管道输出立即来处理其结果。
OP的函数停止了被调用者的进一步执行,直到获取所有文件,因为foreach语句在枚举之前累积整个数组。使用慢速网络或大型目录树,这可能需要几分钟。