Мне нужно создать скрипт Powershell, который читает файл Word (.docx) и заменяет строки гиперссылками.До сих пор, основываясь на этом скрипте , я мог легко заменить все вхождения строки другой строкой.С этим скриптом я могу искать строку и заменять ее гиперссылкой.Однако заменяется только первое вхождение.
Вот мое понимание проблемы:
Первый скрипт использует параметры ReplaceWith
и Replace=wdReplaceAll
функции Execute
Find
Интерфейс.Проблема в том, что ReplaceWith
ожидает объект String, а не объект Hyperlink.
Второй сценарий не определяет эти параметры, поэтому он использует только функцию Find.Execute()
для перемещения начала объекта Range внайдена строка, а затем вставлена ссылка в этой позиции.
Поскольку я не могу заменить все вхождения сразу, я бы попытался перебрать все совпадения, чтобы вставить ссылки в их местоположение.Но Find.Execute()
возвращает только логическое значение ... Теперь я думаю о том, чтобы, возможно, переопределить диапазон, чтобы исключить найденное вхождение и цикл до конца документа, но это кажется сложным.
Допустим, я 'у нас есть файл Word с этим текстом:
Другими словами, каждая из статей, связанных здесь, является указателем на несколько списков по теме.Некоторые из связанных статей сами являются списками списков списков.Эта статья также является списком списков.
Вот простой сценарий, который заменяет только первое вхождение «списков» относительной ссылкой.Я пытаюсь заменить все вхождения списков на гиперссылку $ linkPath, но не могу найти как.Справка?
Add-Type -AssemblyName "Microsoft.Office.Interop.Word"
$wdunits = "Microsoft.Office.Interop.Word.wdunits" -as [type]
$objWord = New-Object -ComObject Word.Application
$objWord.Visible = $false
# Text to find and replace by a link
$findText = "lists"
# Link to file
$linkPath = ".\Untitled.png"
# Source Word (2007+) file
$objDoc = $objWord.Documents.Open([FILE TO READ FROM])
# Resulting file
$saveAs = [FILE TO SAVE TO]
# Set Range to all document content
$range = $objDoc.Content
$range.movestart($wdunits::wdword,$range.start) | Out-Null
# Execute params
$matchCase = $false
$matchWholeWord = $true
$matchWildcards = $false
$matchSoundsLike = $false
$matchAllWordForms = $false
$forward = $true
$wrap = 1
$format = $False
$wdReplaceNone = 0
$wdFindContinue = 1
$wdReplaceAll = 2
# $wordFound is true is $findText is found in $range.
# $range.find.execute modifies the start of the range
$wordFound = $range.find.execute($findText,$matchCase,`
$matchWholeWord,$matchWildCards,$matchSoundsLike,`
$matchAllWordForms,$forward,$wrap)
if($wordFound){
$objDoc.Hyperlinks.Add($range,$linkPath,$null,$null,$findText) | Out-Null
}
$objDoc.SaveAs($saveAs)
$objDoc.Close()
$objWord.Quit()
$rc = [System.Runtime.Interopservices.Marshal]::ReleaseComObject($objWord)
[gc]::Collect()
[gc]::WaitForPendingFinalizers()
Ссылка