如何替换文件夹中 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()
我已经找到并编辑了每个 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()