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

3
这是我的第一个StackOverflow问题,但我会尽量考虑社区标准。
我在Win7 Pro上运行Office 2013和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 和 Excel 2013 | Bug | Work-a-round 看起来是在讨论同样的问题。我按照XXInvidiaXX提供的线程 / 文化解决方案,但仍然生成了相同的错误。Problems with Excel automation in PowerShell 中Roy给出了一个指向时间错误的答案,但我插入了一个Sleep命令并尝试分别运行打开和关闭命令,但两者都无效。非常感谢任何帮助,特别是基础理论。

难道不应该是 $wb1.close() 吗? - Dane Boulton
Dane,感谢您的快速回复。我最初使用了$wb1.Close()并进行了测试。我忘记改回来了。我已经更新了标题/问题。 - BI_Badger
我使用Win8.1而不是Win7,但我无法复制错误。我在桌面上创建了“Projects\EDCautomation\attach”路径,在该位置创建了一个名为“Ryan Sullican-Template.xlsx”的空白工作簿,将路径字符串的开头更改为$env:USERPROFILE,并成功运行了脚本。这可能与你的工作簿有关,文件中可能存在一些奇怪的问题。也许关闭PS或重新启动计算机再试一次,以确保没有什么卡在内存中? - TheMadTechnician
所有在MSDN上的示例都至少指定了第一个可选参数。也许可以尝试$wb1.Close($false)$wb1.Close($false,$null,$false) - Mathias R. Jessen
@MathiasR.Jessen - 谢谢你,$wb1.Close($false) 对我很有效。感谢你的帮助! - BI_Badger
@MathiasR.Jessen 如果您想获得荣誉和结束页面,请将其提交为答案,我会点赞。 - BI_Badger
2个回答

3
尽管对于Workbook.Close()方法的参数都是可选的,但MSDN上的所有示例都提供了至少一个参数(SaveChanges),这让我认为当您不提供任何参数时,PowerShell无法识别该方法签名。您可以尝试使用以下代码:
$wb1.Close($false)

或者

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

将其替换为$true以保存您可能已经进行的任何更改。


添加 $false 可以解决与 $OfficeObject.Quit() 方法类似的问题。谢谢! - Goujon

0
我倾向于在 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)

同时确保以管理员身份运行。


顺便提一下,我还会通过 [Environment]::UserName 声明您的用户名,以使您的脚本更具可移植性 - 将其设置为变量(例如 $user),然后在文件路径中间使用它。然后它将查找运行脚本的人的桌面文件夹。虽然这对于此项目来说并不一定相关,但养成这个好习惯是很有必要的。 - Myles
我得到了“方法调用失败,因为[System.__ComObject]不包含名为'Quit'的方法。” - HackSlash
@HackSlash - 你正在运行哪个版本的PowerShell,并且你是否以管理员身份运行它? - Myles
5.1.18362.628 和是的 - HackSlash

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接