Get-Childitem 使用大量内存

问题描述 投票:0回答:1

我知道这个主题已经有很多线程,我尝试将所有想法放入我的 powershell 代码中,以使 get-childitem 减少内存消耗,但它仍然占用大量内存。

这是我的事情:有一个包含超过 10 个 Mio 子目录的目录,我需要使用 get-childitem 来遍历这些子目录。内存消耗高达 50GB 以上,在某些时候我必须终止进程而不是终止我的服务器。

这是我的代码。它递归地搜索一些 xml 文件(每个子目录都有一个),如果找到该 xml 文件,则读取内容并向两个变量($a 和 $b)添加一些值。我需要 try-catch 因为有时 xml 文件已损坏并且没有所需的信息。

$a = $b = 0
gci -Recurse -File -Filter "file.xml" -path C:\dir\ | ForEach-Object {
    try {
        $FullName = $_.FullName
        [xml]$content = gc $_.FullName
        $a += ($content.Directory.File | % {$_.Size} | measure-object -sum).sum
        $b += $content.Directory.File.count
    } catch {
        (Get-date -Format "MMM dd HH:mm:ss") + " Error: Problem executing " + $FullName + ". Error message: " + $_.Exception.Message | Out-File $LogFile -Append    
    }
}

有人有办法让它以更少的内存使用量运行吗?

谢谢

编辑: 这是它搜索的示例 xml 文件

<?xml version="1.0" encoding="utf-8"?>
<Directory>
    <File Name="xxxxxx.doc">
        <Size>22222</Size>
        <CreationTime>xxxxxxxxx</CreationTime>
    </File>
    <File Name="yyyyy.doc">
        <Size>11111</Size>
        <CreationTime>20140723141441</CreationTime>
    </File>
</Directory>
powershell get-childitem
1个回答
-2
投票

尝试以下。我更新以包含所有目录。 :

 $a = $b = 0
 foreach($file in [System.IO.Directory]::GetFiles('c:\dir', 'file.xml', [System.IO.SearchOption]::AllDirectories)){
    try {
        $FullName = $file.FullName
        [xml]$content = gc $file.FullName
        $a += ($content.Directory.File | % {$file.Size} | measure-object -sum).sum
        $b += $content.Directory.File.count
    } catch {
        (Get-date -Format "MMM dd HH:mm:ss") + " Error: Problem executing " + $FullName + ". Error message: " + $file.Exception.Message | Out-File $LogFile -Append    
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.