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

Method invocation failed because [System.__ComObject] does not contain a method named 'Close' in Powershell v4.0

这是我的第一个 Whosebug 问题,但我会尽量牢记社区标准..

我是 运行 Office 2013 on Win7 Pro 和 PoSh v4.0。执行后续脚本后,我收到以下错误:"Method invocation failed because [System.__ComObject] does not contain a method named '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提供的thread/culture解决方案,产生了同样的错误。

Problems with Excel automation in PowerShell Roy 的回答指出了一个计时错误,但我插入了一个 Sleep 命令并分别尝试 运行 打开和关闭命令,但都无济于事。

非常感谢任何帮助,尤其是基础理论。

尽管 Workbook.Close() are all optional, all the examples on MSDN 的参数至少提供了一个(SaveChanges 参数),但让我相信当您不这样做时 PowerShell 无法识别方法签名'提供任何参数。

你的运气可能更好:

$wb1.Close($false)

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

替换为 $true 以保存您所做的任何更改

我倾向于在Excel进程级别($xl)使用Quit()的方法,而不是工作簿($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)

另外一定要运行它作为管理员。