Как запустить макрос Word (заменить текст) из Powershell? - PullRequest
0 голосов
/ 26 апреля 2019

Я ищу способ заменить текст в текстовых документах с помощью powershell. Используя макрос в normal.dot (все документы) и передавая текст поиска и замены с помощью скрипта powershell.

Macro

Sub Machine()

    Selection.Find.ClearFormatting
    Selection.Find.Replacement.ClearFormatting
    With Selection.Find
        .Text = $Text
        .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

$Desktop = [Environment]::GetFolderPath("Desktop")
$Document = "$Desktop\HL2532-00E.docx"

$Text = "2532-00"
$ReplaceText = "2532-35"

$Word = New-Object -ComObject Word.Application
$Document = $Word.Documents.Open("$Document")
$Word.Run("Machine")
$Document.Save()
$Word.Quit()
$a=[System.Runtime.InteropServices.Marshal]::ReleaseComObject($Word)

1 Ответ

0 голосов
/ 27 апреля 2019

Вы не определяете никаких переменных в вашем макросе.Вам придется обновить его до чего-то вроде этого:

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.Вы можете найти ссылки на эти перечисления на странице, указанной выше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...