PowerShell을 사용하여 Word 문서(.docx)에서 모든 주석 및 주석 블록을 제거합니다.

PowerShell을 사용하여 Word 문서(.docx)에서 모든 주석 및 주석 블록을 제거합니다.

다음을 사용하여 Word 문서(.docx)의 주석 블록을 포함한 모든 주석을 제거할 수 있는 방법이 있습니까?파워셸?

삽화:

**여기에 이미지 설명을 입력하세요**

답변1

PowerShell과 COM을 사용하여 MSOffice DOM을 호출해야 합니다. PowerShell은 이 작업을 자체적으로 수행할 수 없습니다.

PowerShell을 사용하여 단어를 시작합니다. 이를 위해서는 PowerShell을 이해해야 합니다.

Word DOM 언어를 사용하여 원하는 대로 변경하세요. - 이를 위해서는 Word 프로그래밍과 Office DOM을 이해해야 합니다.

PowerShell을 활용하여 단어 및 기타 문서에 영향을 미치는 방법에 대한 많은 예가 있습니다.

웹 전체에서 PowerShell을 사용하여 단어를 조작합니다.

PowerShell과 Word로 시작하기

PowerShell을 사용하여 Word 문서 생성

주말 스크립터: Word Doc에 설명 추가

PowerShell을 사용하여 Word Docs에서 댓글 수 계산

$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 매크로를 통해 표시된 것처럼 단어 문서에서 주석을 삭제하는 기본값은 다음과 같습니다.

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()

관련 정보