如何将 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.EXE
和 powershell.exe
的用户名列来执行此操作
根据名称获取特定文档:
$doc = $word.Documents | Where-Object {$_.Name -eq "Document2"}
您可以通过查看计数来查看打开了多少文档:
$word.Documents.Count
我有一个 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.EXE
和 powershell.exe
根据名称获取特定文档:
$doc = $word.Documents | Where-Object {$_.Name -eq "Document2"}
您可以通过查看计数来查看打开了多少文档:
$word.Documents.Count