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

How to connect Powershell script to an already opened document?

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

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

但是随着需求的变化,我现在需要在一个已经打开的文档中 运行 这个 PS 脚本。是否有任何选项可以强制 PowerShell 找到打开的文档(例如按名称)并 "connect" 到它?

仅供参考:我想要获得的序列是:我打开文件,启动一些宏,从 VBA 调用我的 PS 脚本(这里我需要 PS能够 "fetch" 一个打开的文档),启动其他宏。

非常感谢您!

这应该与 for Excel 相同:

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

注意同一用户限制。不过,我建议通过 PowerShell 以编程方式完成整个操作,.

如果 word 不是 运行,是 运行 在不同的用户下,或者是 运行 作为管理员(并且 PowerShell 不是 运行 作为管理员)你会收到错误:

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