我有一个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才能“获取”打开的文档),启动其他宏。
非常感谢您!
答案 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.EXE
和powershell.exe
要获取基于名称的特定文档:
$doc = $word.Documents | Where-Object {$_.Name -eq "Document2"}
您可以通过查看计数来检查打开了多少文档:
$word.Documents.Count