2016-04-11 2 views
3

Мне удалось найти & редактирование в одном файле слова. С помощью этого кода:Как заменить все вхождения строки в документы Word в папке

$objWord = New-Object -comobject Word.Application 
$objWord.Visible = $false 

$objDoc = $objWord.Documents.Open("C:\users\stefan\test\New Microsoft Word Document.docx") 
$objSelection = $objWord.Selection 

$FindText = "that" 
$MatchCase = $False 
$MatchWholeWord = $true 
$MatchWildcards = $False 
$MatchSoundsLike = $False 
$MatchAllWordForms = $False 
$Forward = $True 
$Wrap = $wdFindContinue 
$Format = $False 
$wdReplaceNone = 0 
$ReplaceWith = "this" 
$wdFindContinue = 1 

$a = $objSelection.Find.Execute($FindText,$MatchCase,$MatchWholeWord, ` 
$MatchWildcards,$MatchSoundsLike,$MatchAllWordForms,$Forward,` 
$Wrap,$Format,$ReplaceWith) 
$objDoc.Save() 
$objWord.Quit() 

Но я хочу сделать это для всей папки. Я пытался вставить что-то вроде этого:

$objWord = New-Object -comobject Word.Application 
$objWord.Visible = $false 

$list = Get-ChildItem "c:\users\stefan\test\*.*" -Include *.doc* 
foreach($item in $list){ 
$objDoc = $objWord.Documents.Open($list.FullName,$true) 

$objSelection = $objWord.Selection 

$FindText = "Sara" 
$MatchCase = $False 
$MatchWholeWord = $true 
$MatchWildcards = $False 
$MatchSoundsLike = $False 
$MatchAllWordForms = $False 
$Forward = $True 
$Wrap = $wdFindContinue 
$Format = $False 
$wdReplaceNone = 0 
$ReplaceWith = "AJMOO" 
$wdFindContinue = 1 

$a = $objSelection.Find.Execute($FindText,$MatchCase,$MatchWholeWord, ` 
$MatchWildcards,$MatchSoundsLike,$MatchAllWordForms,$Forward,` 
$Wrap,$Format,$ReplaceWith) 
$objDoc.Save() 
$objWord.Quit() 
} 

Кроме того, она изменяет только один элемент, который нашел, но я хочу, чтобы все элементы в файле. Спасибо.

+0

Я до сих пор, чтобы проверить, но я вижу один потенциальный большой вопрос. '$ wdFindContinue' используется _before_, он определен. '$ wdFindContinue = 1' должен появиться, прежде чем назначить его' $ wrap'. Это что-то меняет? Это может сделать первый файл неработоспособным, но последующее может быть прекрасным. В любом случае это должно быть изменено. – Matt

+0

@Matt, я сейчас проверю эту проблему, и я дам вам сейчас :) Спасибо. – Stefan0309

ответ

2

Несколько Замены

Кроме того, она изменяет только один элемент, который нашел, но я хочу, чтобы все элементы в файле

Это потому, что вы не установили объем замены на все предметы. Это из следующего аргумента, который вы не указали в своем Execute method call. Установите переменную под названием $wdReplaceAll and set it to 2. Затем вы настраиваете свой вызов, чтобы добавить эту переменную.

$a = $objSelection.Find.Execute($FindText,$MatchCase,$MatchWholeWord, ` 
$MatchWildcards,$MatchSoundsLike,$MatchAllWordForms,$Forward,` 
$Wrap,$Format,$ReplaceWith,$wdReplaceAll) 

Это исправляет эту проблему при работе с одним файлом.

нескольких файлов

Но я хочу сделать это для всей папки

Частичная проблема с, что ваш не правильно запрашивая папку для файлов. -Include полон и работает, когда вы сотрудничаете с -Recurse, но вы так относитесь к нему как к -Filter, так что настройте как таковой.

$list = Get-ChildItem "c:\users\stefan\test\" -filter "*.doc*" 

Далее, когда вы зацикливание вы не используете текущей итерации, но и всю коллекцию при вызове .open()

$objDoc = $objWord.Documents.Open($list.FullName,$true) 

Если вместо этого

$objDoc = $objWord.Documents.Open($item.FullName,$true) 

в соответствии с вашим определением цикла.

Теперь вам нужно быть уверенным, что вы закрываете каждый документ до, вы покидаете приложение. Прямо сейчас вы бросаете слово внутри цикла.

foreach($item in $list){ 
    #.... Stuff and things happens here. 
    $objDoc.Save() 
    $objDoc.Close() 
} 

$objWord.Quit() 

Объявление переменной и вызывает

Прямо сейчас вы установили $wrap к значению переменной $wdFindContinue. Когда это сначала называется $wdFindContinue, оно равно null, так как оно не установлено в несколько строк позже в коде.

$Wrap = $wdFindContinue 
#... 
$wdFindContinue = 1 

Переключить порядок этих линий или просто установить $wrap непосредственно в 1. Я не уверен о последствиях этого является некорректным.

1

К счастью, @Matt Я решил свой код.

Вот правильная версия, которая работает:

$objWord = New-Object -comobject Word.Application 
$objWord.Visible = $false 

$list = Get-ChildItem "c:\users\stefan\test\*.*" -Include *.doc* 
foreach($item in $list){ 
$objDoc = $objWord.Documents.Open($item.FullName,$true) 

$objSelection = $objWord.Selection 
$wdFindContinue = 1 
$FindText = "Sara" 
$MatchCase = $False 
$MatchWholeWord = $true 
$MatchWildcards = $False 
$MatchSoundsLike = $False 
$MatchAllWordForms = $False 
$Forward = $True 
$Wrap = $wdFindContinue 
$Format = $False 
$wdReplaceNone = 0 
$ReplaceWith = "AJMOO" 
$wdFindContinue = 1 
$ReplaceAll = 2 

$a = $objSelection.Find.Execute($FindText,$MatchCase,$MatchWholeWord, ` 
$MatchWildcards,$MatchSoundsLike,$MatchAllWordForms,$Forward,` 
$Wrap,$Format,$ReplaceWith,$ReplaceAll) 
$objDoc.Save() 
$objDoc.Close() 
} 
$objWord.Quit() 
Смежные вопросы