PowerShell を使用して Word 文書 (.docx) 内のすべてのコメントとコメント ブロックを削除する

PowerShell を使用して Word 文書 (.docx) 内のすべてのコメントとコメント ブロックを削除する

Word文書(.docx)内のコメントブロックを含むすべてのコメントを削除する方法はありますか?パワーシェル?

図:

**ここに画像の説明を入力してください**

答え1

PowerShell で COM を使用して、MSOffice DOM を呼び出す必要があります。PowerShell だけではこれを実行できません。

Word を起動するには PowerShell を使用します。これを行うには PowerShell を理解する必要があります。

Word DOM 言語を使用して、必要な変更をすべて実行します。これを行うには、Word プログラミングと Office DOM を理解している必要があります。

PowerShell を活用して Word やその他のドキュメントに影響を与える方法の例はたくさんあります。

Web 上で 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 マクロ/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 コマンドレットの目的です。コードにこの 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()

関連情報