PowerShell Excel报告脚本奇怪的错误

我有一个与PowerShell的奇怪问题。 我有其他脚本类似于在整个脚本中多次使用的行上抛出错误。

我正在使用get-content来获取CSV文件。 然后,我开始parsing通过这些数据只select某些列,并将其输出到Excel中。 这是我的一个问题发生的地方

这是非常不一致的,但在通过csvparsing的某个时间点,我得到这个错误

Exception setting "Item": "Call was rejected by callee. (Exception from HRESULT: 0x80010001 (RPC_E_CALL_REJECTED))"

在这一行,用于将数据输出到特定列和行的excel。

$excel.Cells.Item <<<< ($rowMonth, $columnMonth) = "$item"

我注意到,虽然,如果我拿着滚动条,同时parsing数据,我通过这个错误。 我也注意到它几乎每次都停在一个不同的地方(给出或者拿出几个数据单元格),或者有时我根本就没有得到这个错误。

立即我得到这个错误每个失败的插入我得到这个错误

Assignment failed because [System.__ComObject] doesn't contain a settable property 'Item()'.

…直到我在脚本的parsing部分完成了错误。

我试图谷歌这些错误,并已经很less有关于Excel的PowerShell的信息,我很难找出问题是什么(第3天..)

我有4个其他脚本运行这个代码行

$excel.Cells.Item($rowNumber, $column) = "$item"

他们从来没有告诉我这个错误。

一旦我的parsing已经完成(如果它在那里,我作弊,而我试图debugging并按住滚动条)我有这里我用这个线切换到Excel中的另一个工作表,它会错误的每一次这里。

$sheet2 = $workBook.WorkSheets.Item($sheetName2).Select()

还给了我第一个错误,我已经张贴..此外,当我虽然parsing一半虽然得到错误,尽pipe它错误,Excel要求我设置书读/写(…再次…只有时。 ….)。

这里可能是什么问题,为什么这么不一致呢? 难道是内存限制? (我已经parsing了CSV中比waaay更多的数据,并且从未遇到过这个问题)

请帮助!

这是我如何创build我的Excel对象。

 #Create an instance of Excel $excel = New-Object -comobject Excel.Application #declaring sheet names $sheetName = "some sheet name" #open Excel file [string]$file = "C:\Users\Desktop\excel-file.xlsx" $workBook = $excel.Workbooks.open($file) $workBook.WorkSheets.Item($sheetName).activate() $excel.Visible = $true $excel.displayAlerts = $false 

这里是我输出到excel的地方:

 #Declaring variables $i = 0 $rowNumber = 2 $rowMonth = 2786 $data1 = Get-Content $file1 foreach($row in $data1){ if($row){ $line = $row.Split(",") $i++ #reset back to the first column once there is no more data for that row $column = 1 $columnMonth = 7 $dataColumn = 0 if($i -ge 1){ foreach($item in $line){ $dataColumn++ if($dataColumn -eq 1 -or $dataColumn -eq 2 -or $dataColumn -eq 5 -or $dataColumn -eq 7){ $excel.Cells.Item($rowNumber, $column) = "$item" $excel.Cells.Item($rowMonth, $columnMonth) = "$item" $column++ $columnMonth++ }#endif }#end foreach $rowNumber++ $rowMonth++ }#end if $i }#end if $row }#end foreach 

我不会使用select或activate,而是为每个工作表创build对象,然后在各个工作表上调用cells.item,而不是整个工作簿。 所以首先做$Sheet1 = $WorkBook.Worksheets.Item(1) ,它创build第一个工作表的工作表对象。 然后使用$sheet1.Cells.item($row,$col) = $item

有很多来源为什么不使用select或激活。 这里是一个: 我如何激活一个特定的工作簿和特定的工作表?

你不应该使用它的最大原因是因为性能,主要是没有必要。

我发现我的问题是:

在脚本中,我正在打开一个工作簿,检查单元格的date,并将该date与当前date进行比较。 一旦我得到了差异,我现在知道我必须循环多less次我的报告,并closures工作簿。 比起我开始的一个批处理脚本,在过去的15天里收集了大量的数据,然后我使用了一个(开关)。 一旦我有我的数据,我再次打开excel,并开始我的报告。

问题是closures和重新开放excel之间的时间,我很快重新打开同样的工作簿之前,它已经完全closures。 所以,当parsing我的数据时,工作簿将变得“可用”并中断我的脚本抛出这些错误。

我通过在第二次打开excel之前放置Start-Sleep -sec 20来解决这个问题,并且还没有给我任何问题。

编辑:我已经去了,并正确地使用对象。 另外,我已经调整了我的代码,只打开一次excel,而不是我一直在做的开放式的,开放式的。