답변1
PowerShell과 COM을 사용하여 MSOffice DOM을 호출해야 합니다. PowerShell은 이 작업을 자체적으로 수행할 수 없습니다.
PowerShell을 사용하여 단어를 시작합니다. 이를 위해서는 PowerShell을 이해해야 합니다.
Word DOM 언어를 사용하여 원하는 대로 변경하세요. - 이를 위해서는 Word 프로그래밍과 Office DOM을 이해해야 합니다.
PowerShell을 활용하여 단어 및 기타 문서에 영향을 미치는 방법에 대한 많은 예가 있습니다.
웹 전체에서 PowerShell을 사용하여 단어를 조작합니다.
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()