方法调用失败,因为[System .__ ComObject]在Powershell v4.0中不包含名为“Close”的方法

时间:2015-03-26 21:05:41

标签: powershell scripting powershell-v4.0

这是我的第一个StackOverflow问题,但我会尽量保持社区标准。

我在Win7 Pro和PoSh v4.0上运行Office 2013。在执行后续脚本时,我收到以下错误:“方法调用失败,因为[System .__ ComObject]不包含名为”Close“的方法。”

$xl = New-Object -comobject Excel.Application
$xl.Visible = $false
$xl.DisplayAlerts = $false
$filepath = "C:\Users\rysullivan\Desktop\Projects\EDCautomation\attach\"
$wb1 = $xl.Workbooks.Open((Join-Path $filepath "Ryan Sullivan-Template.xlsx"))
sleep 5
$wb1.Close()
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($xl)

为了与呈现将重现错误的最短代码的标准保持一致,我从更大的自动化开发了上述代码

Powershell 4.0 and Excel 2013 | Bug | Work-a-round似乎正处于同一点。我遵循了XXInvidiaXX提供的线程/文化解决方案,并生成了相同的错误。

Problems with Excel automation in PowerShell有一个Roy的答案指出了一个计时错误,但是我插入了一个Sleep命令并尝试单独运行open和close命令,两者都无济于事。

非常感谢任何帮助,特别是基础理论。

2 个答案:

答案 0 :(得分:0)

即使Workbook.Close()的参数都是可选的,all the examples on MSDN也提供至少一个( SaveChanges 参数),这让我相信PowerShell无法识别该方法当你没有提供任何论据时签名。

你可能会有更好的运气:

$wb1.Close($false)

$wb1.Close($false,$null,$null)

替换$true以保存您可能做出的任何更改

答案 1 :(得分:0)

我倾向于在Excel流程级别使用Quit()方法(本例中为$xl),而不是工作簿($wb1)。

因此,使用您的代码,它将按如下方式编写(使用$xl.Quit()代替$wb1.Close()):

$xl = New-Object -comobject Excel.Application
$xl.Visible = $false
$xl.DisplayAlerts = $false
$filepath = "C:\Users\rysullivan\Desktop\Projects\EDCautomation\attach\"
$wb1 = $xl.Workbooks.Open((Join-Path $filepath "Ryan Sullivan-Template.xlsx"))
sleep 5
$xl.Quit()
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($xl)

另请务必以管理员身份运行。