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

Ste*_*BEG 5 com powershell ms-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()
Run Code Online (Sandbox Code Playgroud)

但我想对整个文件夹执行此操作。我尝试插入这样的内容:

$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()
}
Run Code Online (Sandbox Code Playgroud)

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

Mat*_*att 3

多次更换

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

这是因为您没有将替换范围设置为所有项目。该参数来自您在Execute 方法调用中未指定的下一个参数。设置一个名为 的变量$wdReplaceAll并将其设置为 2。然后您调整调用以添加该变量。

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

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

多个文件

但我想对整个文件夹执行此操作

部分问题是您没有正确查询文件夹中的文件。-Include很挑剔,并且在与您合作时工作-Recurse,但是您将其视为-Filter无论如何,因此请进行调整。

$list = Get-ChildItem "c:\users\stefan\test\" -filter "*.doc*"
Run Code Online (Sandbox Code Playgroud)

接下来,当您循环时,您不使用当前迭代,而是在调用时使用整个集合.open()

$objDoc = $objWord.Documents.Open($list.FullName,$true)
Run Code Online (Sandbox Code Playgroud)

应该改为

$objDoc = $objWord.Documents.Open($item.FullName,$true)
Run Code Online (Sandbox Code Playgroud)

根据你的循环定义。

现在,您需要确保在退出应用程序之前关闭每个文档。现在你正在退出循环内的单词。

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

$objWord.Quit()
Run Code Online (Sandbox Code Playgroud)

变量声明和调用

现在您设置$wrap为变量的值$wdFindContinue。第一次调用时$wdFindContinue为 null,因为它没有在代码后面的几行中设置。

$Wrap = $wdFindContinue 
#...
$wdFindContinue = 1 
Run Code Online (Sandbox Code Playgroud)

切换这些行的顺序或直接设置$wrap为 1。我不确定这不正确的含义。