решение1
Вам нужно вызвать MSOffice DOM, используя COM с PowerShell. PowerShell не может сделать это сам по себе.
Для запуска Word используется PowerShell. Для этого нужно понимать PowerShell.
Используйте язык Word DOM для внесения любых необходимых изменений. Для этого вам необходимо понимать программирование Word и Office DOM.
Существует множество примеров того, как использовать PowerShell для работы с документами Word и другими документами.
Манипулирование Word с помощью PowerShell по всему Интернету.
Создание документов Word с помощью PowerShell
Weekend Scripter: Добавить комментарий к документу Word
Используйте PowerShell для подсчета комментариев в документах 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()
Хотя вышеизложенное касается подсчета, тот же подход можно использовать и для удаления.
Никогда не запускайте код, который вы не понимаете до конца или которому не можете доверять, независимо от того, откуда вы его взяли.
Планируйте это. Напишите свой код. Протестируйте свой код. Возвращайтесь, если возникнут проблемы.
Обновление для OP
Что касается вашего вопроса...
попробуйте такие вещи, как $doc.Comments.remove или $doc.DeleteAllComments.
… не гадайте об этом. Вы можете буквально открыть Word, запустить макрорекордер, попробовать то, что вы делаете, щелкая по документу, рекордер напишет вам код, который вы можете сохранить и вставить в свой скрипт. Да, вам нужно сохранить документ, когда вы вносите в него изменения, так же, как если бы вы делали это вживую в Word.
По умолчанию для удаления комментариев в документе Word, как показано с помощью макросов Word, используется...
ActiveDocument.DeleteAllComments
Если вы хотите пройтись по документу... то что-то вроде этого псевдокода...
ActiveDocument.Comments | ForEach {$_.Delete}
Опять же, эта часть не совсем касается PowerShell, а скорее понимания того, чего ожидает MSWord, и того, как ориентироваться в этой модели.
Вот почему я всегда говорю людям: не усложняйте такие вещи. Делайте это в Word Macro/VBA, а затем экспортируйте для использования в инструментах автоматизации, таких как PowerShell. Если вы не можете сделать это изначально в Word, PowerPoint и т. д., то вряд ли вы сможете сделать это с помощью внешнего инструмента.
Вы даже можете создать макрос с помощью VBA и сохранить его для использования в других целевых документах, а затем вызвать этот макрос через PowerShell.
Пример:
Вызов макроса Word vba из PowerShell
https://blogs.technet.microsoft.com/stefan_stranger/2016/03/15/call-word-vba-macro-from-powershell
Вам нужно использовать методы, которые вам предоставляет Word, PowerPoint и т. д., поэтому вы должны знать, что это такое, и, следовательно, как их искать. Для этого и предназначен командлет Get-Member. Вам не нужна эта строка Get-Member в вашем коде, я просто поместил ее туда в качестве инструкции.
$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()