【发布时间】:2021-12-24 21:57:36
【问题描述】:
我正在尝试创建一个 Excel 工作簿,然后使用从搜索许多 txt 文件中找到的数据填充单元格。
我在找到“IDENTIFICATION DIVISION”之后和在找到“ENVIRONMENT DIVISION”之前读取了一个文件并提取了所有 cmets 然后我在我的 excel 工作簿中填充两个单元格。如果文件和单元格二是提取的 cmets,则单元格一。
我在工作服务器上有 256GB 内存。在 Powershell 引发内存错误之前,正在使用小于 %5。
谁能看出我哪里出错了?
谢谢, -罗恩
$excel = New-Object -ComObject excel.application
$excel.visible = $False
$workbook = $excel.Workbooks.Add()
$diskSpacewksht= $workbook.Worksheets.Item(1)
$diskSpacewksht.Name = "XXXXX_Desc"
$col1=1
$diskSpacewksht.Cells.Item(1,1) = 'Program'
$diskSpacewksht.Cells.Item(1,2) = 'Description'
$CBLFileList = Get-ChildItem -Path 'C:\XXXXX\XXXXX' -Filter '*.cbl' -File -Recurse
$Flowerbox = @()
ForEach($CBLFile in $CBLFileList) {
$treat = $false
Write-Host "Processing ... $CBLFile" -foregroundcolor green
Get-content -Path $CBLFile.FullName |
ForEach-Object {
if ($_ -match 'IDENTIFICATION DIVISION') {
# Write-Host "Match IDENTIFICATION DIVISION" -foregroundcolor green
$treat = $true
}
if ($_ -match 'ENVIRONMENT DIVISION') {
# Write-Host "Match ENVIRONMENT DIVISION" -foregroundcolor green
$col1++
$diskSpacewksht.Cells.Item($col1,1) = $CBLFile.Name
$diskSpacewksht.Cells.Item($col1,2) = [String]$Flowerbox
$Flowerbox = @()
continue
}
if ($treat) {
if ($_ -match '\*(.{62})') {
Foreach-Object {$Flowerbox += $matches[1] + "`r`n"}
$treat = $false
}
}
}
}
$excel.DisplayAlerts = 'False'
$ext=".xlsx"
$path="C:\Desc.txt"
$workbook.SaveAs($path)
$workbook.Close
$excel.DisplayAlerts = 'False'
$excel.Quit()
【问题讨论】:
-
您正在尝试将 FileInfo 对象
$CBLFile作为值插入到单元格中。也许您的意思是把文件的名称或全名放在那里? -
@Theo 该字段 $CBLFile 仅捕获名称。
-
你不应该依赖一个对象字符串化的任何东西。如果你想要文件名,添加
$CBLFile.Name,如果你想要文件完整路径和名称,添加$CBLFile.FullName。我想说的代码要具体。 -
你需要在主循环中将
$treat初始化为$false。然后在if ($treat) {..}块中也将其设置回$false,否则它将永远保持$true。为什么要在所有工作完成之后而不是在创建 Com 对象之后直接设置 Excel 属性.DisplayAlerts? -
和
$col1在循环中永远不会重置为 1,因此您可能超过了 Excel 文件可以处理的列数。
标签: excel powershell