Remova todos os comentários e blocos de comentários em um documento do Word (.docx) usando o PowerShell

Remova todos os comentários e blocos de comentários em um documento do Word (.docx) usando o PowerShell

Existe alguma maneira de remover todos os comentários, incluindo o bloco de comentários em um documento do Word (.docx), usandoPowerShell?

Ilustração:

**insira a descrição da imagem aqui**

Responder1

Você precisa ligar para o DOM do MSOffice, usando COM com PowerShell. O PowerShell não pode fazer isso sozinho.

Você usa o PowerShell para iniciar o Word - você precisa entender o PowerShell para fazer isso.

Use a linguagem Word DOM para fazer as alterações desejadas. - você precisa entender a programação do Word e o Office DOM para fazer isso.

Existem muitos exemplos de como aproveitar o PowerShell para afetar o Word e outros documentos.

Manipulando palavras com PowerShell em toda a web.

Começando com PowerShell e Word

Gere documentos do Word com PowerShell

Weekend Scripter: Adicionar comentário ao documento do Word

Use o PowerShell para contar comentários em documentos do 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()

Embora o texto acima seja sobre contagem, o mesmo tipo de abordagem pode ser usado para remover.

Nunca execute qualquer código que você não entenda totalmente/pode confiar, não importa de onde você o obteve.

Planeje isso. Escreva seu código Teste seu código Volte se tiver problemas.

Atualização para OP

Quanto à sua consulta..

tentando coisas como $doc.Comments.remove ou $doc.DeleteAllComments.

… não adivinhe. Você pode literalmente abrir o Word, iniciar o gravador de macro, tentar o que está fazendo clicando no documento, o gravador escreveria o código para você, que você pode salvar e colocar em seu script. Sim, você deve salvar um documento ao fazer alterações nele, da mesma forma que faria se estivesse fazendo isso ao vivo no Word.

O padrão para excluir comentários em um documento do Word, conforme mostrado por meio de macros do Word, é...

ActiveDocument.DeleteAllComments

Se você quiser acompanhar o documento... então algo como este psudo-código...

ActiveDocument.Comments | ForEach {$_.Delete}

Novamente, esta parte não é realmente uma questão do PowerShell, mas de entender o que o MSWord espera e como navegar nesse modelo.

É por isso que sempre digo às pessoas: não compliquem demais esse tipo de coisa. Faça isso no Word Macro/VBA e depois exporte para uso em ferramentas de automação como o PowerShell. Se você não puder fazer isso nativamente no Word, PowerPoint, etc., é altamente improvável que consiga fazer isso usando uma ferramenta externa.

Você pode até criar uma macro usando VBA e salvá-la para uso em outros destinos de documento e chamar essa macro via PowerShell.

Exemplo:

Chame a macro Word vba do PowerShell

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

Você tem que usar os métodos que o Word, PowerPoint, etc. lhe oferece, então você tem que saber o que são e, portanto, como procurá-los. É para isso que serve o cmdlet Get-Member. Você não precisa disso, linha Get-Member em seu código, apenas coloquei lá como um ponto de instrução.

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

informação relacionada