Rimuovi tutti i blocchi di commenti e commenti in un documento Word (.docx) usando PowerShell


0

C'è un modo per rimuovere tutti i commenti compreso il blocco di commenti in un documento di Word (.docx) utilizzando PowerShell ?

Illustrazione:

**enter image description here**

Risposte:


1

È necessario chiamare nel DOM MSOffice, usando COM con PowerShell. PowerShell non può farlo da solo.

Si utilizza PowerShell per avviare la parola    - Devi capire PowerShell per farlo.

Usa il linguaggio DOM di Word per fare qualunque cambiamento tu voglia dopo.    - devi capire la programmazione di Word e il DOM di Office per farlo.

Ci sono molti esempi su come sfruttare PowerShell per influenzare la parola e altri documenti.

Manipolazione di parole con PowerShell su tutto il web.

A partire da PowerShell e Word

Genera documenti di Word con PowerShell

Weekend Scripter: aggiungi commento a Word Doc

Utilizzare PowerShell per conteggiare i commenti in Documenti di Word

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

Anche se quanto sopra riguarda il conteggio, è possibile rimuovere lo stesso tipo di approccio.

Non eseguire mai un codice che non comprendi pienamente / di cui puoi fidarti, indipendentemente da dove lo ottieni.

Pianificalo. Scrivi il tuo codice Prova il tuo codice Torna se hai problemi.

Aggiornamento per OP

Per quanto riguarda la tua richiesta ..

provando cose come $ doc.Comments.remove o $ doc.DeleteAllComments.

... non indovinare a questo. Puoi letteralmente aprire la parola, avviare il registratore di macro, provare a fare quello che stai facendo facendo clic sul documento, il registratore dovrebbe scrivere il codice per te, che puoi salvare e inserire nel tuo script. Sì, devi salvare un documento quando apporti delle modifiche ad esso, proprio come faresti se lo facessi dal vivo in Word.

L'impostazione predefinita per eliminare i commenti in una parola doc come mostrato tramite Word Macro è ...

ActiveDocument.DeleteAllComments

Se volevi andare al doc ... allora qualcosa di simile a questo pseudo-codice ...

ActiveDocument.Comments | ForEach {$_.Delete}

Di nuovo, questa parte non è realmente una cosa di PowerShell, ma capire cosa si aspetta MSWord e come navigare in quel modello.

Che è sempre il motivo per cui dico alla gente, non complicare troppo questo tipo di cose. Esegui queste operazioni in Word Macro / VBA e quindi esporta per l'utilizzo in strumenti di automazione come PowerShell. Se non puoi farlo in modo nativo in Word, PowerPoint, ecc., È altamente improbabile che tu possa farlo usando uno strumento esterno.

È anche possibile creare una macro utilizzando VBA e salvarla per l'utilizzo in altri target doc e richiamarla tramite PowerShell.

Esempio:

Chiama Word vba Macro da PowerShell

https://blogs.technet.microsoft.com/stefan_stranger/2016/03/15/call-word-vba-macro-from-powershell

Devi usare i metodi di Word, PowerPoint, ecc., Così devi sapere cosa sono e quindi come cercarli. Questo è ciò che è per il cmdlet Get-Member. Non hai bisogno di questo, linea Get-Member nel tuo codice, ho appena messo lì un punto di istruzione.

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

Grazie mille ormai. Farò un tentativo la prossima settimana e poi ti risponderà se ha funzionato :)
SteffPoint

Non preoccuparti, assicurati solo di dedicare del tempo prezioso all'apprendimento di come eseguire questa operazione direttamente con la parola VBA, in quanto è ciò che finirai quando utilizzi PS per farlo.
postanote

Ho controllato lo script e sta contando correttamente i commenti. Tuttavia, volevo integrare la funzione di rimozione per i commenti, provando cose come $doc.Comments.remove o $doc.DeleteAllComments. Ma non ho ancora avuto successo. Inoltre non riesco a trovare (utilizzando i popolari motori di ricerca) alcun metodo per eliminare i commenti. Puoi aiutarmi qui, per favore? Immagino che dopo aver cancellato i commenti richieda anche una funzione come questa: $doc.save()
SteffPoint

Grazie mille! Script funziona bene
SteffPoint
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.