使用 PowerShell 刪除 Word 文件 (.docx) 中的所有註解和註解區塊

使用 PowerShell 刪除 Word 文件 (.docx) 中的所有註解和註解區塊

有沒有辦法使用刪除所有註釋,包括 Word 文件(.docx)中的註釋區塊電源外殼

圖解:

**在此輸入影像描述**

答案1

您需要使用 COM 和 PowerShell 呼叫 MSOffice DOM。 PowerShell 本身無法做到這一點。

您使用 PowerShell 來啟動 word - 您必須了解 PowerShell 才能執行此操作。

使用 Word DOM 語言進行您想要的任何變更。 - 您必須了解 Word 程式設計和 Office DOM 才能執行此操作。

有許多關於如何利用 PowerShell 影響 Word 和其他文件的範例。

在網路上使用 PowerShell 操作單字。

從 PowerShell 和 Word 開始

使用 PowerShell 產生 Word 文檔

週末腳本編寫者:在 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 呼叫該巨集。

例子:

從 PowerShell 呼叫 Word vba 巨集

https://blogs.technet.microsoft.com/stefan_stranger/2016/03/15/call-word-vba-macro-from-powershell

你必須使用Word、PowerPoint等提供給你的方法,所以你必須知道它們是什麼以及如何找到它們。這就是 Get-Member cmdlet 的用途。您不需要程式碼中的 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()

相關內容