Powershell - 针对大型目录运行脚本时出现内存不足错误

Posted

技术标签:

【中文标题】Powershell - 针对大型目录运行脚本时出现内存不足错误【英文标题】:Powershell - Out of Memory Error When Running Script Against Large Directory 【发布时间】:2019-01-09 12:23:18 【问题描述】:

所以我有一个脚本,它获取 CSV 列表中包含的歌曲的文件名并检查目录以查看文件是否存在,然后导出丢失的信息(如果有)。 CSV 文件如下所示:

现在,当我在较小的目录上测试时,我的脚本似乎可以工作,但是当我针对外部驱动器上包含的实际目录(大约 10TB 的文件)运行它时,我在脚本之前收到“system.outofmemoryexception”错误可以完成。

$myPath = 'Z:\Music\media'
        $myCSV = 'C:\Users\Me\Documents\Test.csv'
        $CSVexport = 'C:\Users\Me\Documents\Results.csv'

    $FileList = Get-ChildItem $myPath -Recurse *.wav | Select-Object -ExpandProperty Name -Unique
    Import-CSV -Path $myCSV | 
        Where-Object $FileList -notcontains $_.Filename |
        Select ID, AlbumTitle, TrackNo, Filename | Export-CSV $CSVexport -NoTypeInformation

    $missing = Import-CSV $CSVexport | Select-Object -ExpandProperty Filename
    If(!([string]::IsNullOrEmpty($missing)))
        Write-Output "Missing files:`n" $missing

有没有办法让这个脚本消耗更少的内存或更有效的方法来处理大型文件目录?我是 Powershell 脚本的新手,无法找到解决此问题的方法。

【问题讨论】:

如果您逐行运行,您是否在Get-ChildItemImport-CSV 出现内存不足异常? 10TB 的文件?!当然当然内存不足了!特别是考虑到您正在递归地尝试首先将所有内容加载到内存中。 @HAL9256 异常发生在 get-childitem @TheIncorrigible1 有没有办法读取文件而无需将它们加载到内存中? @jl93 迭代地,而不是递归地。让问题变小 【参考方案1】:

当@TheIncorrigible 反复说时,他的意思是这样的。请注意,我使用不同的文件路径,因为我没有 Z: 驱动器。最好的方法是将您的 csv 项目加载到一个变量中,然后使用 foreach 循环遍历该变量,然后对这些项目中的每一个进行测试以查看文件是否存在,然后如果它没有将该项目添加到一个新变量.完成后,将包含缺失项的新变量导出到 csv。

$myPath = "C:\temp\"
$myCsv = "C:\temp\testcsv.csv"
$CSVexport = "C:\temp\results.csv"

$CsvItems = Import-Csv -Path $myCsv
$MissingItems

foreach($item in $CsvItems)
   
    $DoesFileExist = Test-Path ($myPath + $item.Filename) 

    If($DoesFileExist -eq $false)
    
        $MissingItems = $MissingItems + $item
    


$MissingItems | Export-Csv $CSVexport -NoTypeInformation

【讨论】:

以上是关于Powershell - 针对大型目录运行脚本时出现内存不足错误的主要内容,如果未能解决你的问题,请参考以下文章

使用 powershell 访问远程计算机时出现审计错误

如何使用 .NET 4 运行时运行 PowerShell?

在 PowerShell 中针对 WID 远程运行 sqlcmd

执行 powershell 脚本时出错

powershell怎么运行

Powershell调用webrequest不起作用