我知道这个主题已经有很多线程,我尝试将所有想法放入我的 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>
尝试以下。我更新以包含所有目录。 :
$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
}
}