Entfernen Sie alle Kommentare und Kommentarblöcke in einem Word-Dokument (.docx) mit PowerShell

Entfernen Sie alle Kommentare und Kommentarblöcke in einem Word-Dokument (.docx) mit PowerShell

Gibt es eine Möglichkeit, alle Kommentare einschließlich des Kommentarblocks in einem Word-Dokument (.docx) zu entfernen, indemPower Shell?

Illustration:

**Bildbeschreibung hier eingeben**

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

verwandte Informationen