【问题标题】:How do I replace all occurrences of string in Word documents in a folder如何替换文件夹中Word文档中所有出现的字符串
【发布时间】:2016-08-01 19:45:15
【问题描述】:

我已经设法找到和编辑每个单词文件。使用此代码:

$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()
}

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

【问题讨论】:

  • 我还没有测试,但我发现了一个潜在的大问题。 $wdFindContinue定义之前使用。 $wdFindContinue = 1 应该在您将其分配给 $wrap 之前出现。这有什么改变吗?这可能会使第一个文件不起作用,但后续文件可能会很好。无论哪种方式都应该改变。
  • @Matt,我现在会检查这个问题,现在我会让你:) 谢谢。

标签: powershell ms-word com


【解决方案1】:

多次替换

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

这是因为您没有将替换的范围设置为所有项目。来自您在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。我不确定这不正确的含义。

【讨论】:

    【解决方案2】:

    感谢@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()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-04-20
      • 1970-01-01
      • 1970-01-01
      • 2012-04-20
      • 2023-03-15
      • 2013-05-30
      • 1970-01-01
      • 2011-02-23
      相关资源
      最近更新 更多