Вы не определяете никаких переменных в вашем макросе.Вам придется обновить его до чего-то вроде этого:
Sub Machine(FindText,ReplaceText)
Selection.Find.ClearFormatting
Selection.Find.Replacement.ClearFormatting
With Selection.Find
.Text = FindText
.Replacement.Text = ReplaceText
.Forward = True
.Wrap = wdFindContinue
.Format = False
.MatchCase = False
.MatchWholeWord = False
.MatchWildcards = False
.MatchSoundsLike = False
.MatchAllWordForms = False
End With
Selection.Find.Execute Replace:=wdReplaceAll
End Sub
Затем, когда вы вызываете его из PowerShell, вы просто добавляете эти аргументы после имени макроса:
$Word.Run("Machine",$Text,$ReplaceText)
Или вы можете пропустить макрос и просто сделать все это в PowerShell, используя метод Find.Execute()
(задокументировано здесь ).
$Document = "$home\Desktop\HL2532-00E.docx"
$Text = "2532-00"
$ReplaceText = "2532-35"
$Word = new-object -ComObject Word.Application
$Document = $Word.Documents.Open($Document)
$Find = $Document.Content.Find
$Find.ClearFormatting()|out-null
$Find.Execute($Text, $false, $false, $false, $false, $false, $true, 1, $false, $ReplaceText, 2)
$Document.Save()
$Word.Quit()
$a=[System.Runtime.InteropServices.Marshal]::ReleaseComObject($Word)
Синтаксис метода Execute
таков:
Execute(FindText, MatchCase, MatchWholeWord, MatchWildcards, MatchSoundsLike, MatchAllWordForms, Forward, Wrap, Format, ReplaceWith, Replace)
Большинство из них $true
/ $false
, где FindText
и ReplaceWith
являются строками.Двумя нечетными являются Wrap
и Replace
, которые являются перечислениями, где 1 = wdFindContinue и 2 = wdReplaceAll.Вы можете найти ссылки на эти перечисления на странице, указанной выше.