如何用PowerShell递归解析文件夹中所有报告文件并写入Excel
批量递归处理.ctx文件并写入Excel的解决方案
需要批量递归处理指定文件夹下所有格式一致的.ctx报告文件,提取每个文件的第11、16、17行数据,按特定规则解析后写入Excel的指定列。以下是基于现有单文件代码修改后的完整解决方案:
# 配置路径 $ctxFolderPath = "\\Path\Report" # 存放.ctx文件的文件夹路径 $excelFilePath = "\\Path\Logs\log1.xlsm" # Excel文件路径 $worksheetName = "Payer" # 递归获取所有.ctx文件(包含子目录) $ctxFiles = Get-ChildItem -Path $ctxFolderPath -Filter "*.ctx" -Recurse -File # 初始化Excel对象(仅打开一次,提升效率) $Excel = New-Object -ComObject Excel.Application $Excel.Visible = $false $Excel.DisplayAlerts = $false $Workbook = $Excel.Workbooks.Open($excelFilePath) $Worksheet = $Workbook.Worksheets.Item($worksheetName) # 获取当前Excel表的最后一行,后续新增数据从下一行开始 [int]$lastRow = $Worksheet.UsedRange.Rows.Count + 1 # 循环处理每个.ctx文件 foreach ($file in $ctxFiles) { # 一次性读取文件内容,再提取指定行 $content = Get-Content -Path $file.FullName $FileDateLine = $content | Select-Object -Index 11 $FileLine = $content | Select-Object -Index 16 $FileDocCountLine = $content | Select-Object -Index 17 # 按规则解析并写入Excel对应列 $Worksheet.Cells.Item($lastRow, 1) = $FileLine.Split("\")[6] # 名称写入第1列 $Worksheet.Cells.Item($lastRow, 2) = $FileDateLine.Split()[8] # 日期写入第2列 $Worksheet.Cells.Item($lastRow, 3) = $FileDocCountLine.Split()[9] # 文档计数写入第3列 # 行数自增,准备写入下一个文件的数据 $lastRow++ } # 保存并关闭Excel $Workbook.Save() $Workbook.Close($true) $Excel.Quit() # 彻底清理Excel COM对象,避免残留进程 [System.Runtime.Interopservices.Marshal]::ReleaseComObject($Worksheet) | Out-Null [System.Runtime.Interopservices.Marshal]::ReleaseComObject($Workbook) | Out-Null [System.Runtime.Interopservices.Marshal]::ReleaseComObject($Excel) | Out-Null [System.GC]::Collect() [System.GC]::WaitForPendingFinalizers()
关键改进说明
- 递归遍历文件:通过
Get-ChildItem -Recurse自动处理目标文件夹及所有子目录中的.ctx文件 - Excel对象复用:仅初始化一次Excel实例,避免重复打开/关闭带来的性能损耗和进程残留
- 高效文件读取:每个文件仅读取一次内容,再提取指定行,比原代码多次调用
Get-Content更高效 - 安全进程清理:使用COM对象释放+垃圾回收替代原代码的
Stop-Process,避免误杀用户正在使用的Excel进程 - 简化行号计算:提前获取初始最后一行,循环中逐行递增,避免重复计算
UsedRange
内容的提问来源于stack exchange,提问作者DGW
相关产品推荐
相关产品推荐

