Get-Childitem - 提高内存使用率和性能

Arb*_*lac 6 powershell

我希望能够检索文件所有者、LastAccessTime、LastWriteTime、CreationTime。当扩展到大型目录结构时,Get-Childitem 存在已知的性能问题。

我们在包含超过 100000 个子文件夹的文件夹中查找文件时遇到了一些性能问题。

这是我的脚本:

$Dir = get-childitem "W:\DATA" -recurse -force

$Dir | Select-Object name,fullname, LastAccessTime, LastWriteTime, CreationTime, @{N='Owner';E={$_.GetAccessControl().Owner}} | Export-Csv -path C:\Scripts\xlsx.csv -NoTypeInformation
Run Code Online (Sandbox Code Playgroud)

提前致谢,

San*_*zon 2

尝试一下,应该比 更快Get-ChildItem。您也可以使用[SearchOption]::AllDirectoriesand noCollections.Queue但我不确定这是否会消耗更少的内存。

using namespace System.Collections
using namespace System.IO

class InfoProps {
    [string] $Name
    [string] $FullName
    [datetime] $LastAccessTime
    [datetime] $LastWriteTime
    [datetime] $CreationTime
    [string] $Owner

    Infoprops([object]$FileInfo)
    {
        $this.Name           = $FileInfo.Name
        $this.FullName       = $FileInfo.FullName
        $this.LastAccessTime = $FileInfo.LastAccessTime
        $this.LastWriteTime  = $FileInfo.LastWriteTime
        $this.CreationTime   = $FileInfo.CreationTime
        $this.Owner          = $FileInfo.GetAccessControl().Owner
    }
}

$initialDirectory = $pwd.Path
$queue = [Queue]::new()
$queue.Enqueue($initialDirectory)

& {
    while ($queue.Count)
    {
        $target = $queue.Dequeue()
        foreach ($childs in [Directory]::EnumerateDirectories($target)) {
            $queue.Enqueue($childs)
        }
        [InfoProps] [DirectoryInfo] $target # => Remove this line if you want only files!
        [InfoProps[]] [FileInfo[]] [Directory]::GetFiles($target)
    }
} | Export-Csv test.csv -NoTypeInformation
Run Code Online (Sandbox Code Playgroud)