如何替换文件夹中 Word 文档中所有出现的字符串

How do I replace all occurrences of string in Word documents in a folder

我已经找到并编辑了每个 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()
}

此外,它只更改找到的一项,但我想要文件中的所有项目。 谢谢

多次替换

Also, it changes only one item that is found, but I want all items in the file

这是因为您没有将替换范围设置为所有项目。来自您未在 Execute method call. Set a variable called $wdReplaceAll and set it to 2 中指定的下一个参数。然后调整调用以添加该变量。

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

这解决了 运行 针对一个文件时的问题。

多个文件

But I want to do it for whole folder

部分问题是您没有正确查询文件夹中的文件。 -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 为空,因为它没有在代码后面的几行中设置。

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

切换这些行的顺序或直接将 $wrap 设置为 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()