2016-04-11 3 views
3

Ich habe es geschafft, & bearbeiten pro Wort Datei zu finden. Mit diesem Code:Wie ersetze ich alle Vorkommen von Zeichenfolge in Word-Dokumenten in einem Ordner

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

Aber ich möchte es für den gesamten Ordner tun. Ich habe versucht, so etwas wie dies einzufügen:

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

Auch es ändert sich nur ein Element, das gefunden wird, aber ich möchte alle Elemente in der Datei. Danke.

+0

ich noch nicht zu testen, aber ich sehe ein mögliches großes Problem. '$ wdFindContinue' wird verwendet, bevor es definiert ist. '$ wdFindContinue = 1 'sollte kommen, bevor Sie es $ wrap zuweisen. Ändert das etwas? Dies würde möglicherweise dazu führen, dass die erste Datei nicht funktioniert, aber die nachfolgende könnte in Ordnung sein. In jedem Fall sollte das geändert werden. – Matt

+0

@Matt, ich werde diese Sorge jetzt überprüfen, und ich werde dich jetzt lassen :) Danke. – Stefan0309

Antwort

2

Mehrere Ersatz

Auch

, es ändert sich nur ein Element, das gefunden wird, aber ich möchte alle Elemente in der Datei

Dies ist, weil Sie nicht den Umfang der Ersatz eingestellt haben alle Gegenstände sein. Das ist von dem nächsten Argument, das Sie in Ihrem Execute method call nicht angegeben haben. Legen Sie eine Variable $wdReplaceAll and set it to 2 fest. Dann passen Sie Ihren Aufruf an, um diese Variable hinzuzufügen.

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

Das behebt dieses Problem, wenn es für eine Datei ausgeführt wird.

Mehrere Dateien

Aber ich will es für ganze Ordner mit dem

Das partiellen Problem tun, ist Sie nicht richtig auf den Ordner für Dateien abfragt. -Include ist knifflig und funktioniert, wenn Sie mit -Recurse zusammenarbeiten, aber Sie behandeln es wie eine -Filter sowieso so einstellen Sie so.

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

Als nächstes, wenn Sie Sie Looping stattdessen die aktuelle Iteration verwendet, sondern die ganze Sammlung beim Aufruf .open()

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

Sollte

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

wie pro Ihre Loop-Definition sein.

Jetzt müssen Sie sicher sein, dass Sie jedes Dokument vor schließen Sie die Anwendung beenden. Im Moment hörst du in der Schleife auf.

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

$objWord.Quit() 

Variablendeklaration und ruft

Gerade jetzt setzen Sie $wrap auf den Wert der Variablen $wdFindContinue. Wenn das zuerst $wdFindContinue aufgerufen wird, ist Null, da es nicht auf ein paar Zeilen später in dem Code festgelegt wird.

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

Schalten Sie die Reihenfolge dieser Linien oder stellen nur $wrap direkt zu 1. Ich bin nicht sicher, dass die Auswirkungen dieser nicht mehr korrekt sind.

1

Dankbar an @Matt habe ich meinen Code gelöst.

Hier ist eine richtige Version, die funktioniert:

$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() 
Verwandte Themen