Я занимаюсь назначением нижнего колонтитула для сотен документов Word с их текущим путем к файлу.Вот мой код, который выполняет эту работу:
Я планирую установить для $Word.Visible
значение false
, но пока это не для целей отладки.
Это получает всеword docs в каталоге, добавляет нижний колонтитул с их путем к файлу, затем сохраняет и закрывает.
Я пытаюсь обработать случай, подобный этому:
Я просто хочу пропустить это, или, возможно, принудительно открыть и продолжить.Однако я не уверен, что это лучший способ сделать это, и мне нужна помощь.
Спасибо, Элайджа
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