如何将Powershell脚本连接到已打开的文档?

时间:2018-08-29 09:45:06

标签: powershell ms-word office-interop com-interop

我有一个Powershell脚本,该脚本对MSWord文档进行了一些修改。在脚本的开头,PS打开文档:

$word = New-Object -ComObject Word.Application
$desktop_path = [Environment]::GetFolderPath("Desktop")
$doc = $word.Documents.Open("$desktop_path" + "blabla.docx")

但是随着需求的变化,我现在需要在一个已经打开的文档中运行此PS脚本。是否有任何选项可以强制PowerShell查找打开的文档(例如通过名称)并“连接”到该文档?

FYI:我要获得的顺序是:打开文件,启动一些宏,从VBA调用我的PSScript(在这里我需要PS才能“获取”打开的文档),启动其他宏。

非常感谢您!

1 个答案:

答案 0 :(得分:1)

这应该与for Excel相同:

$word = [Runtime.Interopservices.Marshal]::GetActiveObject('Word.Application')

请注意同一用户限制。我建议通过as suggested by Guenther通过PowerShell以编程方式完成整个操作。

如果word未运行,正在其他用户下运行或以admin(并且PowerShell未以admin身份运行)运行,则会出现错误:

Exception calling "GetActiveObject" with "1" argument(s): "Operation unavailable (Exception from HRESULT: 0x800401E3 (MK_E_UNAVAILABLE))"
At line:1 char:1
+ $word = [Runtime.Interopservices.Marshal]::GetActiveObject('Word.Appl ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : COMException

根据建议,检查PowerShell和Word是否在同一用户下运行。为此,您可以转到任务管理器>详细信息,然后检查WINWORD.EXEpowershell.exe

的用户名列

要获取基于名称的特定文档:

$doc = $word.Documents | Where-Object {$_.Name -eq "Document2"}

您可以通过查看计数来检查打开了多少文档:

$word.Documents.Count