Powershell通过处理部分地停下来

我有以下的Power-Shell(4.0)脚本。 它打开一个Excel的书(2013年),并从单元格获得一个url,并打开它。 然后将网页下载到.htm文件。 它遍历工作表中的每一行(~3000)。

我遇到的问题是第一个约500个文件在大约3分钟内完成。 然后它会显着减慢到每2-3分钟只创build一个文件的地方。 我检查了我的可用内存和CPU使用情况,都很好(RAM 2.93GB使用的8GB,CPU在35%)。

有什么我可以做到这一点,加快速度?

cls $output_folder = "c:\temp" $OUTPUT_FILENAME="" # comment following line to add a timestamp to each file gets created if($OUTPUT_FILENAME.length -eq 0) {$OUTPUT_FILENAME=(get-date).tostring().replace(" ","").replace("/","").replace(":","")} $filepath = "C:\Temp\MeteringHistory\Meters for Maximo Upload" $xl = New-Object -COM "Excel.Application" $xl.Visible = $false $wb = $xl.Workbooks.Open($filepath) $ws = $wb.Worksheets.Item("WOhistory") $maxRow = ($ws.UsedRange.rows).count $minRow = 1 for ($minrow -le $maxrow ; $minrow++) { $website = $ws.cells.item($minRow, 1).text $fileName = $ws.cells.item($minRow, 5).text + " - " + $ws.cells.item($minRow, 4).text $fileName = $fileName -replace '/', '_' $wc=new-object system.net.webclient $wc.UseDefaultCredentials = $true $wc.downloadfile($website,"c:\temp\MeteringHistory\Files\$filename.htm") $wc.Dispose() } 

我会首先将Excel导出为CSV,然后再将Excel导出。 你甚至可以从PowerShell本身做到这一点。 然后使用invoke-webrequest而不是你所有的样板文件,并用它来完成。 它只能在几行代码中完成。 这样你就可以将问题简化为基本的PowerShell。

太快加速这个过程,你可以通过后台作业并行地调用webrequest。

很难知道什么是错误的没有错误。 我会尝试一件事:避免创build和处理数百个WebClient对象,当你可以重用第一个。 尝试:

 cls $output_folder = "c:\temp" $OUTPUT_FILENAME="" # comment following line to add a timestamp to each file gets created if($OUTPUT_FILENAME.length -eq 0) {$OUTPUT_FILENAME=(get-date).tostring().replace(" ","").replace("/","").replace(":","")} $filepath = "C:\Temp\MeteringHistory\Meters for Maximo Upload" $xl = New-Object -COM "Excel.Application" $xl.Visible = $false $wb = $xl.Workbooks.Open($filepath) $ws = $wb.Worksheets.Item("WOhistory") $maxRow = ($ws.UsedRange.rows).count $minRow = 1 $wc=new-object system.net.webclient $wc.UseDefaultCredentials = $true for ($minrow -le $maxrow ; $minrow++) { $website = $ws.cells.item($minRow, 1).text $fileName = $ws.cells.item($minRow, 5).text + " - " + $ws.cells.item($minRow, 4).text $fileName = $fileName -replace '/', '_' $wc.DownloadFile($website,"c:\temp\MeteringHistory\Files\$filename.htm") } $wc.Dispose()