Как подключить скрипт Powershell к уже открытому документу? - PullRequest
0 голосов
/ 29 августа 2018

У меня есть скрипт Powershell, который выполняет некоторые модификации с документом MSWord. В начале сценария PS открывается документ:

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

Но поскольку требования изменились, мне нужно запустить этот скрипт PS в уже открытом документе. Есть ли какие-либо параметры, чтобы заставить PowerShell найти открытый документ (например, по названию) и «подключиться» к нему?

К вашему сведению: последовательность, которую я хочу получить: я открываю файл, запускаю несколько макросов, вызываю из VBA мой PSScript (и здесь мне нужен PS, чтобы иметь возможность «выбрать» открытый документ), запускаю другие макросы.

Заранее большое спасибо!

1 Ответ

0 голосов
/ 29 августа 2018

Это должно совпадать с для Excel :

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

Обратите внимание на ограничение того же пользователя. Я бы порекомендовал сделать все это программно через PowerShell, , как предложено Guenther .

Если слово не запущено, работает под другим пользователем или работает от имени администратора (а 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
...