答案1
您需要使用 COM 和 PowerShell 呼叫 MSOffice DOM。 PowerShell 本身無法做到這一點。
您使用 PowerShell 來啟動 word - 您必須了解 PowerShell 才能執行此操作。
使用 Word DOM 語言進行您想要的任何變更。 - 您必須了解 Word 程式設計和 Office DOM 才能執行此操作。
有許多關於如何利用 PowerShell 影響 Word 和其他文件的範例。
在網路上使用 PowerShell 操作單字。
使用 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()