Powershell - 运行 针对大型目录的脚本时出现内存不足错误
Powershell - Out of Memory Error When Running Script Against Large Directory
所以我有一个脚本,它获取 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 脚本编写的新手,但找不到解决此问题的方法。
当@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
所以我有一个脚本,它获取 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 脚本编写的新手,但找不到解决此问题的方法。
当@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