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

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

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

1 ответ1

1

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

Вы используете PowerShell, чтобы начать Word - вы должны понимать PowerShell, чтобы сделать это.

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

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

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

Начиная с PowerShell и Word

Создание документов Word с помощью PowerShell

Сценарист выходного дня: Добавить комментарий к Word Doc

Используйте 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()

Хотя вышеизложенное относится к подсчету, для удаления можно использовать тот же тип подхода.

Никогда не запускайте код, который вы не полностью понимаете / которому можете доверять, независимо от того, откуда вы его взяли.

Запланируйте это. Напишите свой код Проверьте свой код Вернитесь, если у вас есть проблемы.

Обновление для ОП

Что касается вашего запроса ..

пробовать такие вещи, как $ doc.Comments.remove или $ doc.DeleteAllComments.

... не догадывайся об этом. Вы можете буквально открыть слово, запустить макрос-рекордер, попробовать то, что вы делаете, щелкая по документу, рекордер напишет для вас код, который вы сможете сохранить и вставить в свой скрипт. Да, вы должны сохранить документ, когда вносите в него изменения, так же, как если бы вы делали это вживую в Word.

По умолчанию для удаления комментариев в документе Word, как показано в Word Macros ...

ActiveDocument.DeleteAllComments

Если вы хотели пройтись по документу ... тогда что-то вроде этого псевдокода

ActiveDocument.Comments | ForEach {$_.Delete}

Опять же, эта часть на самом деле не вещь PowerShell, а понимание того, что ожидает MSWord и как ориентироваться в этой модели.

Вот почему я всегда говорю людям, не усложняйте такие вещи. Сделайте это в Word Macro/VBA, а затем экспортируйте для использования в средствах автоматизации, таких как PowerShell. Если вы не можете сделать это изначально в Word, PowerPoint и т.д., Маловероятно, что вы сможете сделать это с помощью внешнего инструмента.

Вы даже можете создать макрос с помощью VBA и сохранить его для использования в других целях документа и вызвать этот макрос через PowerShell.

Пример:

Вызов Word vba Macro из 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()

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .