【问题标题】:Method invocation failed because [System.__ComObject] does not contain a method named 'Close' in Powershell v4.0方法调用失败,因为 [System.__ComObject] 在 Powershell v4.0 中不包含名为“Close”的方法
【发布时间】:2015-05-31 01:59:54
【问题描述】:

这是我的第一个 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 的回答,指出时间错误,但我插入了睡眠命令并尝试分别运行打开和关闭命令,但均无济于事。

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

【问题讨论】:

  • 会不会是$wb1.close()
  • Dane,感谢您这么快就回来。我最初有 $wb1.Close() 并且正在测试。我忘记改回来了。我已经更新了标题/问题。
  • 我使用的是 Win8.1 而不是 Win7,但我无法复制该错误。我在桌面上创建了“Projects\EDCautomation\attach”路径,在该位置创建了一个名为“Ryan Sullican-Template.xlsx”的空白工作簿,将路径字符串的开头更改为$env:USERPROFILE,然后运行脚本没有问题.这可能是与您文件中奇怪的东西相关的工作簿吗?也许关闭 PS 或重新启动并重试以确保它没有卡在内存中?
  • All examples on MSDN 至少指定第一个可选参数。也许试试$wb1.Close($false)$wb1.Close($false,$null,$false)
  • @MathiasR.Jessen - 谢谢,$wb1.Close($false) 似乎对我有用。感谢您的帮助!

标签: powershell scripting powershell-4.0


【解决方案1】:

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

还要确保以管理员身份运行它。

【讨论】:

  • 作为旁注,我还将通过 [Environment]::UserName 声明您的用户名,以使您的脚本更便携 - 将其设置为变量(例如 $user),然后在文件路径的中间。然后它将查找运行脚本的人的桌面文件夹。它不一定与这个项目相关,但它是一个好习惯。
  • 我收到Method invocation failed because [System.__ComObject] does not contain a method named 'Quit'.
  • @HackSlash - 你运行的是什么版本的 Powershell,你是以管理员身份运行的吗?
  • 5.1.18362.628 是的
【解决方案2】:

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

你可能会有更好的运气:

$wb1.Close($false)

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

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

【讨论】:

  • 添加 $false 解决了 $OfficeObject.Quit() 方法的类似问题。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-11-27
  • 2013-07-03
  • 2020-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多