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

时间:2018-08-01 20:14:16

标签: powershell csv out-of-memory powershell-v2.0 large-data-volumes

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

CSV List

现在,当我在一个较小的目录上进行测试时,我的脚本似乎可以运行,但是当我对包含在外部驱动器上的实际目录(大约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脚本的新手,却找不到解决此问题的方法。

1 个答案:

答案 0 :(得分:0)

@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