1

希望有人可以提供建议来帮助我加快 Powershell 脚本的速度。我正在做的是读取数百个 CSV 文件,解析信息以获取有关丢失条目的数据,然后将该输出写入 HTML 文件。这是我用来处理文件的循环:

ForEach ($Filename in $FileList) {
    $CustTemp = import-csv "$FilePath\$Filename"
    $CustName = $CustTemp[0].CustName
    Write-Host "Reading data for $CustName"`r
    For ($counter=0;$counter -lt 31;$counter++){
        $CheckDate = (get-date).AddDays(-$counter)
        $CheckShortDate = $CheckDate.ToShortDateString()
        $TempData = import-csv "$FilePath\$Filename" | Select FileName,FileDate | where {$_.FileDate -eq $CheckShortDate}
        If ($TempData -eq $null) {
            $row = "No file found for $CheckShortDate for $CustName"
            $HTMLReportItems += $row
        }
    $HTMLReportItems = $HTMLReportItems | ConvertTo-Html -Fragment
    }
}

当我使用几个 CSV 文件进行测试时,这个循环运行良好,但是当针对大量文件(300+)运行它时,每个文件(30s-1m)的循环需要很长时间才能完成。我很确定 CSV 文件每次迭代被访问 30 次的原因。我希望有人会对我如何处理数据有更好的建议。

4

1 回答 1

1

您正在阅读$FilePath\$Filename多次。在循环外读取它for,只在内部进行过滤。也将 HTML 生成移到循环之外。

$HTMLReportItems = foreach ($Filename in $FileList) {
  $csv = Import-Csv (Join-Path $FilePath $Filename)
  $CustName = $csv[0].CustName
  $data = $csv | select FileName,FileDate

  Write-Host "Reading data for $CustName"

  for ($counter=0;$counter -lt 31;$counter++){
    $CheckShortDate = (Get-Date).AddDays(-$counter).ToShortDateString()
    $TempData = $data | ? {$_.FileDate -eq $CheckShortDate}
    if ($TempData -eq $null) {
        "No file found for $CheckShortDate for $CustName"
    }
  }
}

$HTMLReportItems = $HTMLReportItems | ConvertTo-Html -Fragment
于 2013-08-02T21:23:46.903 回答