Antwort1
Sie müssen den MSOffice DOM aufrufen und dabei COM mit PowerShell verwenden. PowerShell kann dies nicht allein tun.
Mit PowerShell starten Sie Word. Hierzu müssen Sie sich mit PowerShell auskennen.
Verwenden Sie die Word-DOM-Sprache, um die gewünschten Änderungen vorzunehmen. – Hierzu müssen Sie sich mit der Word-Programmierung und dem Office-DOM auskennen.
Es gibt zahlreiche Beispiele, wie Sie PowerShell nutzen können, um Word und andere Dokumente zu beeinflussen.
Bearbeiten von Word mit PowerShell im gesamten Web.
Erste Schritte mit PowerShell und Word
Word-Dokumente mit PowerShell generieren
Weekend Scripter: Kommentar zu Word-Dokument hinzufügen
Verwenden Sie PowerShell, um Kommentare in Word-Dokumenten zu zählen
$Path = "E:\data\BookDOcs\PS3_StartHere"
$word = New-Object -comobject word.application
$word.visible = $false
Foreach($filepath in (Get-ChildItem $path -Filter *.docx -Recurse))
{
$doc = $word.documents.open($filePath.FullName)
$count = $doc.Comments.count
if( $count -ge 1)
{"$count comments in $filepath"}
$doc.close()
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($doc) | Out-Null
Remove-Variable Doc
}
# CleanUp
$word.quit()
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($word) | Out-Null
Remove-Variable Word
[gc]::collect()
[gc]::WaitForPendingFinalizers()
Obwohl es oben um das Zählen geht, kann der gleiche Ansatz auch zum Entfernen verwendet werden.
Führen Sie niemals Code aus, den Sie nicht vollständig verstehen bzw. dem Sie nicht vertrauen können, unabhängig davon, woher Sie ihn haben.
Planen Sie dies. Schreiben Sie Ihren Code. Testen Sie Ihren Code. Kommen Sie noch einmal zurück, wenn Sie Probleme haben.
Update für OP
Was Ihre Anfrage betrifft...
Versuchen Sie Dinge wie $doc.Comments.remove oder $doc.DeleteAllComments.
… raten Sie nicht. Sie können Word öffnen, den Makrorecorder starten und ausprobieren, was Sie tun, indem Sie durch das Dokument klicken. Der Recorder schreibt den Code für Sie, den Sie speichern und in Ihr Skript einfügen können. Ja, Sie müssen ein Dokument speichern, wenn Sie Änderungen daran vornehmen, genauso wie Sie es tun würden, wenn Sie es live in Word tun würden.
Die Standardeinstellung zum Löschen von Kommentaren in einem Word-Dokument, wie sie über Word-Makros angezeigt wird, ist ...
ActiveDocument.DeleteAllComments
Wenn Sie das Dokument durchgehen möchten, dann so etwas wie dieser Pseudocode …
ActiveDocument.Comments | ForEach {$_.Delete}
Auch dieser Teil hat nicht wirklich etwas mit PowerShell zu tun, sondern erfordert ein Verständnis davon, was MSWord erwartet und wie man in diesem Modell navigiert.
Deshalb sage ich den Leuten immer, dass sie solche Dinge nicht unnötig komplizieren sollen. Machen Sie diese Dinge in Word Macro/VBA und exportieren Sie sie dann zur Verwendung in Automatisierungstools wie PowerShell. Wenn Sie dies nicht nativ in Word, PowerPoint usw. tun können, ist es höchst unwahrscheinlich, dass Sie es mit einem externen Tool tun können.
Sie können sogar ein Makro mit VBA erstellen, es zur Verwendung in anderen Dokumentzielen speichern und dieses Makro über PowerShell aufrufen.
Beispiel:
Rufen Sie das Word-VBA-Makro aus PowerShell auf
https://blogs.technet.microsoft.com/stefan_stranger/2016/03/15/call-word-vba-macro-from-powershell
Sie müssen die Methoden verwenden, die Ihnen Word, PowerPoint usw. zur Verfügung stellen. Sie müssen also wissen, was sie sind und wie Sie sie nachschlagen. Dafür ist das Cmdlet Get-Member gedacht. Sie brauchen diese Get-Member-Zeile nicht in Ihrem Code, ich habe sie nur als Anweisung dort eingefügt.
$Path = "D:\Documents\Test document.docx"
$word = New-Object -comobject word.application
$word.visible = $False
Foreach($filepath in (Get-ChildItem $path -Filter *.docx -Recurse))
{
$doc = $word.documents.open($filePath.FullName)
$count = $doc.Comments.count
if( $count -ge 1)
{"$count comments in $filepath"}
# Get all comment properties and methods so to know what can be used
<#
$doc.Comments | Get-Member
TypeName: System.__ComObject#{0002093d-0000-0000-c000-000000000046}
Name MemberType Definition
---- ---------- ----------
Delete Method void Delete ()
DeleteRecursively Method void DeleteRecursively ()
Edit Method void Edit ()
...
#>
# There are only 3 methods possible. Use the required method to handle the target.
$doc.Comments | ForEach{$_.Delete()}
$doc.save()
$doc.close()
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($doc) | Out-Null
Remove-Variable Doc
}
# CleanUp
$word.quit()
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($word) | Out-Null
Remove-Variable Word
[gc]::collect()
[gc]::WaitForPendingFinalizers()