Удалить все комментарии и блоки комментариев в документе Word (.docx) с помощью PowerShell

Удалить все комментарии и блоки комментариев в документе Word (.docx) с помощью PowerShell

Есть ли способ удалить все комментарии, включая блок комментариев в документе Word (.docx), используяPowerShell?

Иллюстрация:

**введите описание изображения здесь**

решение1

Вам нужно вызвать MSOffice DOM, используя COM с PowerShell. PowerShell не может сделать это сам по себе.

Для запуска Word используется PowerShell. Для этого нужно понимать PowerShell.

Используйте язык Word DOM для внесения любых необходимых изменений. Для этого вам необходимо понимать программирование Word и Office DOM.

Существует множество примеров того, как использовать PowerShell для работы с документами Word и другими документами.

Манипулирование Word с помощью PowerShell по всему Интернету.

Начинаем с PowerShell и Word

Создание документов 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()

Связанный контент