0

我很确定我做对了,但想与社区再次核对。我有一个文件夹结构,比如说c:\test\它有很多文件和文件夹。我在这种结构中也有一个文件夹,比如说c:\test\something\another\temp\这个文件夹及其子文件夹占所有文件的 50% 或更多c:\test\.

我想获取所有*.txt文件的列表c:\test\及其子文件夹的列表,不包括那些在c:\test\something\another\temp\里面和更深的文件。

我不想列举整个事情,包括c:\test\something\another\temp\然后出于性能原因进行管道输出和过滤:没有必要遍历整个c:\test\something\another\temp\树,因为那里没有任何有趣的东西。

看起来Get-ChildItemcmdlet 在这里不能帮助我,我必须求助于 .NET 调用并自己编写递归以排除我不需要的文件夹。

Get-ChildItem-Exclude参数,但它不适用于文件夹,仅适用于文件。

我可以调用 .NET 库我只想确保我没有遗漏任何东西,并且没有 <easier> 方法可以使用库存的 powershell cmdlet 来做到这一点。

在那儿?

4

4 回答 4

3

如果目录真的很大,

(cmd /c dir c:\test\*.txt /b /s) -notlike 'c:\test\something\another\temp\*'

应该比 get-childitem 给你更快的结果。

编辑:

这是不搜索排除目录的不同版本:

$files = 
(cmd /c dir c:\test /b /s /ad) -notlike 'c:\test\something\another\temp*' |
 foreach { iex "cmd /c dir $_\*.txt /b /s /a-d"  }

不知道如何比这更快。

于 2013-11-06T21:21:08.507 回答
1

或者你可以这样做:

Get-ChildItem C:\test -r *.txt | Where {$_.FullName -notlike 'c:\test\something\another\temp\*'}
于 2013-11-06T21:07:13.723 回答
0

利用管道的另一种选择:

function Get-FilesInDir {
    [CmdletBinding()]
    param (
        [Parameter(ValueFromPipeline=$true)]
        $Path,
        $Exclude
    )

    Process {
        $Path | ForEach-Object {
            if( (Resolve-path $_).Path.StartsWith($Exclude) ) { return }

            Get-ChildItem -Path:$_ |
                ForEach-Object { 
                    if($_.PSIsContainer) { Get-FilesInDir -Path:$_.FullName -Exclude:$Exclude }
                    $_.FullName
                }
        }
    }
}
于 2013-11-06T22:08:00.810 回答
0

您可以通过创建自己的递归调用自身的函数来执行此操作,跳过您不想查看的目录。我认为它正在执行您的设想,但只是使用内置 cmdlet 而不是诉诸 .NET Framework 方法。

$searchroot = 'c:\test';
function Get-FilesInDir {
param (
    $DirToSearch
)
    $ItemsInDir = Get-ChildItem -path $DirToSearch;
    foreach ($item in $ItemsInDir) {
        if ($item.FullName -eq 'c:\test\something\another\temp') {
            continue;
        }
        if ($item.PSIsContainer) {
            Get-FilesInDir $item.FullName;
        }
        $item.FullName;
    }
}

Get-FilesInDir $searchroot

这将输出找到的每个文件的完整路径。

如果您有要排除的目录列表,则可以将它们放入一个数组中并修改if围绕 的测试continue以检查每个路径以查看它是否在该数组中。

于 2013-11-06T20:59:58.837 回答