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