我对powershell有一个奇怪的问题。我有其他类似于在整个脚本中多次使用的行上抛出错误的脚本。
我正在使用get-content
来抓取CSV文件。然后我开始解析该数据,只选择某些列并将它们输出到excel中。这是我的一个问题发生的地方......
这是非常不一致的,但是在解析csv的某个时间点我得到了这个错误
Exception setting "Item": "Call was rejected by callee. (Exception from HRESULT: 0x80010001 (RPC_E_CALL_REJECTED))"
在此行上,用于将数据输出到特定列和行的Excel中。
$excel.Cells.Item <<<< ($rowMonth, $columnMonth) = "$item"
我注意到,如果我在解析数据时按住滚动条,我会传递此错误。我也注意到它几乎每次都停在不同的位置(给出或取几个数据单元),或者有时我根本没有得到错误。
在我为每个失败的插入内容出现此错误后,我立即收到此错误
Assignment failed because [System.__ComObject] doesn't contain a settable property 'Item()'.
...直到我完成了脚本解析部分的错误。
我已经尝试过谷歌这些错误了,关于PowerShell的信息已经很少了,而且我很难弄清楚问题是什么(第3天......)
我有4个其他脚本运行这行代码..
$excel.Cells.Item($rowNumber, $column) = "$item"
他们从来没有告诉我这个错误。
一旦我的解析完成了(如果它在那里,我在试图调试并保持滚动条时作弊)我在这里有这行我用来切换到excel中的另一个工作表,它会出错每一次都在这里。
$sheet2 = $workBook.WorkSheets.Item($sheetName2).Select()
还给了我发布的第一个错误。当我在解析一半的时候确实得到了错误,但是当它出错时,excel要求我将书设置为读/写(...再次...只是有时......)。
这里可能出现什么问题,为什么它如此不一致?这可能是内存限制吗? (我已经在CSV中解析了比我在脚本中更多的数据并且从未遇到过这个问题)
请帮忙!
以下是我创建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
答案 0 :(得分:2)
我发现了我的问题:
在脚本中,我打开一个工作簿,检查一个单元格的日期,而不是将该日期与当前日期进行比较。一旦我得到了改变,我现在知道有多少次我必须遍历我的报告并关闭工作簿。比我开始一个批处理脚本,它收集过去15天的一堆数据,然后我使用(切换)。获得数据后,我再次打开excel,开始报告。
问题是关闭和重新打开excel之间的时间,我在完全关闭之前很快就重新打开了同一个工作簿。因此,在解析我的数据时,工作簿将变得“可用”并中断我的脚本抛出这些错误。
我通过在第二次打开excel之前放置一个Start-Sleep -sec 20
来解决这个问题,并且还没有给我任何问题。
编辑:我已经离开并正确修复了对象的使用。另外,我已将我的代码调整为仅打开excel一次,而不是我一直在做的开 - 关,开 - 关。
答案 1 :(得分:1)
我不会使用select或activate,而是为每个工作表创建对象,并在单个工作表上调用cells.item,而不是整个工作簿。
首先,$Sheet1 = $WorkBook.Worksheets.Item(1)
创建第一个工作表的工作表对象。然后使用$sheet1.Cells.item($row,$col) = $item
有很多来源为什么不使用select或activate。这是一个:How do i activate a specific workbook and a specific sheet?
你不应该使用它的最大原因是因为性能,主要是因为没有必要。