2012-06-22 2 views
2

더 이상 존재하지 않는 템플릿에 연결되는 일련의 Word 문서가 있습니다. 이로 인해 사용자가 열려고하면 문제가 발생합니다. 문서 목록을 가져 와서 각각을 반복하고 tempalte를 null로 설정할 수 있습니다. 이 방법으로 문제가 해결되지만 변경하기 전에 템플릿이 무엇인지 확인할 수 없습니다.Powershell에서 누락 된 Word 템플릿 읽기

서식 파일을 열 때 사용할 수없는 경우 Word는 첨부 된 서식 파일을 Normal.dot (x)로 바꿉니다. 그러나 찾으려는 템플리트는 문서의 템플리트 대화 상자에 있습니다. AttachedTempalte() 및 get_AttachedTemplate(). Name 문제의 문서가 Templates 대화 상자에 word로 나열된 다른 템플릿을 가지고있을 때 Name이 Normal.dot를 반환합니다.

나는 이것을 VBA에서 접근 할 수 있으며 PS에서 이것을 할 수 없다는 것은 실망 스럽다. 내가 엉망이 된 곳을 누구든지 볼 수 있니?

$word = new-object -comobject "Word.Application" 
$doc = $word.Documents.Open({document path}) 
$word.Dialogs(Microsoft.Office.Interop.Word.WdWordDialog.wdDialogToolsTemplates).Template() 

결과 :

Missing ')' in method call. 
At :line:1 char:15 
+ $word.Dialogs(M <<<< icrosoft.Office.Interop.Word.WdWordDialog.wdDialogToolsTemplates).Template() 

작업 VBA : 나는 strTemplate에서 볼 수 템플릿 이름과 경로를 볼 수 있습니다

Dim doc as Word.Document 
Dim strTemplate as String 
Set doc = Documents.Open(Filename:=filename, Visible:=False) 
doc.Activate 
strTemplate = Word.Dialogs(wdDialogsToolsTemplates).Template 

후.

나는 ps 스크립트를 확인하고 $ doc.Activate를 추가하는 것이 도움이되지 않는다. 나는 또한 interop와 VBA가 동일한 wdDialog를 사용하지 않는다는 것을 알아 차렸다. PS는 wdDialogToolsTemplates를 사용하여 wdDialogToolsTemplates 및 VBA를 사용합니다. 나는 다음과 같은

[Reflection.Assembly]::LoadWithPartialName("Microsoft.Office.Interop.Word") | out-null 
[Enum]::GetNames("Microsoft.Office.Interop.Word.WdDialogs") 

와 PS에 어셈블리를 점검하고 올바른 옵션이 wdDialogToolsTemplates입니다 확인했다.

$word.Dialogs([Microsoft.Office.Interop.Word.WdWordDialog]::wdDialogToolsTemplates).Template() 

이 블로그 게시물을 참조 : PowerShell에서

+1

작동하는 VBA 코드를 확인하는 데 도움이 될 수 있습니다. – EBGreen

+0

복제 할 수는 있지만 주위를 둘러 볼 방법이 확실하지 않습니다. 나는 시간이 허락하는 한 그것을 계속 파고지만, 오늘은 좀 바쁘다. – EBGreen

답변

0

그렇게 파워 쉘 코드의 3 번째 라인은 다음과 같이한다 유형의 멤버 유형을 지정하고 다음 :: 지정 대괄호 ([])를 사용해야합니다 Powershell enum에 대한 : Jeffrey Snover 또는 Richard Siddaway.

+0

게시물을 읽어 주셔서 감사합니다. 제안 된 명령은 오류를 반환합니다. [Microsoft.Office.Interop.Word.ApplciationClass]에 'Dialogs'라는 메서드가 포함되어 있지 않아 메서드 호출이 실패했습니다. – KFleschner

+0

VBA 인 경우 Dialogs 형식의 변수를 만들고 대화 상자를 설정합니다. wdDialogsToolsTempaltes로 설정하고 Dialogs 개체의 Tempate 속성을 반환합니다. PS에서 뭔가를 할 수 있는지, 아니면 PS에서 어떻게 할 수 있는지는 잘 모르겠습니다. – KFleschner

0

나는 비슷한 것을하려고하고 있으며 주요 목적은 Word 문서 안에 코드를 저장하는 것이 아닙니다. PowerShell을

나는 PowerShell을 경로와 진보의 작은 비트를했다하지만 난 대화 상자에서 경로를 추출 할 수있는 방법을 찾을 수 없습니다.

$objWord = New-Object -ComObject "Word.Application" 
$objWord.Visible = $True 
$objDoc = $objWord.Documents.Open("C:\path\to\document.doc") 
$objToolsTemplates = $objWord.Dialogs.Item([Microsoft.Office.Interop.Word.WdWordDialog]::wdDialogToolsTemplates) 
$objDocStats = $objWord.Dialogs.Item([Microsoft.Office.Interop.Word.WdWordDialog]::wdDialogDocumentStatistics) 

이제 $objToolsTemplates.Show()$objToolsTemplates.Show() 모두는 GUI가 원래 (사용할 수 없음) 템플릿의 경로를 포함하는 대화 상자를 표시하지만, 프로그램 정보를 추출 할 수있는 방법을 찾을 수없는 원인이된다. MSDN WdWordDialog Enumeration documentation에 따르면 두 대화 상자 모두 Template 속성을 가져야합니다. VBScript를

는 결국 내가 대신 VBS로 가야했다. 다음 코드는 원본 (사용할 수없는) 템플릿의 경로를 제공합니다. 적어도 여전히 스크립트입니다.

Option Explicit 

Const wdDialogToolsTemplates = 87 
Const wdDoNotSaveChanges = 0 

Dim objWordApp 
Dim objDoc 
Dim dlgTemplate 

Set objWordApp = CreateObject("Word.Application") 
objWordApp.Visible = False 
Set objDoc = objWordApp.Documents.Open("C:\path\to\document.doc") 
Set dlgTemplate = objWordApp.Dialogs(wdDialogToolsTemplates) 

Wscript.Echo dlgTemplate.Template 

objDoc.Close(wdDoNotSaveChanges) 
objWordApp.Quit 
관련 문제