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