Eliminar todos los comentarios y bloques de comentarios en un documento de Word (.docx) usando PowerShell

Eliminar todos los comentarios y bloques de comentarios en un documento de Word (.docx) usando PowerShell

¿Hay alguna forma de eliminar todos los comentarios, incluido el bloque de comentarios, en un documento de Word (.docx) usandoPotencia Shell?

Ilustración:

**ingrese la descripción de la imagen aquí**

Respuesta1

Debe llamar al DOM de MSOffice mediante COM con PowerShell. PowerShell no puede hacer esto por sí solo.

Utiliza PowerShell para iniciar Word; debe comprender PowerShell para hacer esto.

Utilice el lenguaje Word DOM para realizar los cambios que desee. - Tienes que entender la programación de Word y el DOM de Office para hacer esto.

Hay muchos ejemplos de cómo aprovechar PowerShell para afectar a Word y otros documentos.

Manipulación de Word con PowerShell en toda la web.

Comenzando con PowerShell y Word

Generar documentos de Word con PowerShell

Weekend Scripter: Agregar comentario al documento de Word

Utilice PowerShell para contar comentarios en documentos de 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()

Aunque lo anterior trata sobre contar, se puede utilizar el mismo tipo de enfoque para eliminar.

Nunca ejecute ningún código que no comprenda completamente o en el que no pueda confiar, sin importar de dónde lo obtenga.

Planifica esto. Escribe tu código Prueba tu código Vuelve si tienes problemas.

Actualización para OP

En cuanto a tu consulta..

probando cosas como $doc.Comments.remove o $doc.DeleteAllComments.

… no adivines esto. Literalmente puede abrir Word, iniciar la grabadora de macros, probar lo que está haciendo al hacer clic en el documento, la grabadora escribirá el código por usted, que puede guardar y poner en su secuencia de comandos. Sí, debe guardar un documento cuando le realiza cambios, tal como lo haría si lo hiciera en vivo en Word.

La opción predeterminada para eliminar comentarios en un documento de Word como se muestra a través de macros de Word es...

ActiveDocument.DeleteAllComments

Si querías guiar al doctor... entonces algo como este psudocódigo...

ActiveDocument.Comments | ForEach {$_.Delete}

Nuevamente, esta parte no es realmente una cuestión de PowerShell, sino de comprender qué espera MSWord y cómo navegar por ese modelo.

Por eso siempre le digo a la gente que no compliquen demasiado este tipo de cosas. Haga esto en Word Macro/VBA y luego exporte para usarlo en herramientas de automatización como PowerShell. Si no puedes hacerlo de forma nativa en Word, PowerPoint, etc., es muy poco probable que puedas hacerlo utilizando una herramienta externa.

Incluso puede crear una macro usando VBA y guardarla para usarla en otros destinos de documentos y llamar a esa macro a través de PowerShell.

Ejemplo:

Llamar a la macro Word vba desde PowerShell

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

Tienes que utilizar los métodos que te proporciona Word, PowerPoint, etc., por lo que tienes que saber cuáles son y, por tanto, cómo buscarlos. Para esto sirve el cmdlet Get-Member. No necesita esta línea Get-Member en su código, solo la puse allí como punto de instrucción.

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

información relacionada