C'è un modo per rimuovere tutti i commenti compreso il blocco di commenti in un documento di Word (.docx) utilizzando PowerShell ?
Illustrazione:
C'è un modo per rimuovere tutti i commenti compreso il blocco di commenti in un documento di Word (.docx) utilizzando PowerShell ?
Illustrazione:
Risposte:
È 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()
$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()