Есть ли способ удалить все комментарии, включая блок комментариев в Word-документе (.docx), используя PowerShell?
Иллюстрация:
Есть ли способ удалить все комментарии, включая блок комментариев в Word-документе (.docx), используя PowerShell?
Иллюстрация:
Вам нужно позвонить в MSOffice DOM, используя COM с PowerShell. PowerShell не может сделать это самостоятельно.
Вы используете PowerShell, чтобы начать Word - вы должны понимать PowerShell, чтобы сделать это.
Используйте язык Word DOM, чтобы внести любые изменения, которые вы хотите. - для этого нужно понимать программирование Word и Office DOM.
Есть много примеров того, как использовать PowerShell для работы с Word и другими документами.
Управление Word с помощью PowerShell во всем Интернете.
Создание документов 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()