Открытие большого набора документов Word с помощью Powershell - автоматизация - PullRequest
0 голосов
/ 31 декабря 2018

Я занимаюсь назначением нижнего колонтитула для сотен документов Word с их текущим путем к файлу.Вот мой код, который выполняет эту работу:

Я планирую установить для $Word.Visible значение false, но пока это не для целей отладки.

Это получает всеword docs в каталоге, добавляет нижний колонтитул с их путем к файлу, затем сохраняет и закрывает.

Я пытаюсь обработать случай, подобный этому:

error-window

Я просто хочу пропустить это, или, возможно, принудительно открыть и продолжить.Однако я не уверен, что это лучший способ сделать это, и мне нужна помощь.

Спасибо, Элайджа

Set-ExecutionPolicy bypass;
$path = 'somepath';

$documents = Get-ChildItem -Path $path *.docx -Recurse -Force
$filepaths = foreach ($document in $documents) {$document.fullname}
$Word = New-Object -ComObject Word.application;
$Word.Visible = $true;
foreach ($filepath in $filepaths){

    $Doc = $Word.Documents.OpenNoRepairDialog($filepath);
    $Doc.Unprotect();
    $Selection = $Word.Selection;
    $Doc.ActiveWindow.ActivePane.View.SeekView = 4;
    $Selection.ParagraphFormat.Alignment = 1;
    $Selection.TypeText($filepath);
    $Doc.Save();
    $Doc.Close();
}
$Word.Quit();

Edit1: я сделал правку, в которой добавлено динамическое полеобъект для пути к файлу, а не просто вводить путь к файлу. Таким образом, если вам случится переместить файл, путь к файлу можно обновить до нового пути.Вам нужно будет нажать F9 при выборе нижнего колонтитула в слове, но это лучшее, что вы можете сделать, не делая макрос и сохраняя файл в формате .docm.

Вот исправленный код:

$documents = Get-ChildItem -path *docx -recurse -force
$filepaths = foreach($document in $documents){$document.FullName}
Set-Variable -Name wdFieldFileName -Value 29 -Option constant -Force -ErrorAction SilentlyContinue
$word = New-Object -ComObject Word.Application
#$word.Visible = $true
foreach($filepath in $filepaths){
    $doc = $word.Documents.Open($filepath)
    $sections = $doc.Sections
    $item1 = $sections.Item(1)
    $footer = $item1.Footers.Item(1)
    $range = $footer.Range
    $doc.Fields.Add($range, $wdFieldFileName, '\p')
    $doc.Save()
    $doc.Close()
}
$word.Quit()

Я все еще сталкиваюсь с окном ошибки при попытке открыть поврежденный или документ "нуждающийся в ремонте", как диагностировано словом.Передача нескольких аргументов методу Open () не дает ожидаемых результатов.Вот пример:

Exception calling "Open" with "16" argument(s): "Type mismatch. (Exception from HRESULT: 0x80020005 (DISP_E_TYPEMISMATCH))"
At line:1 char:1
+ $doc = $word.Documents.Open($filepath, $False, $False, $False, $null, ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId : ComMethodTargetInvocation
...