none
Word Templates entfernen/korrigieren RRS feed

  • Frage

  • Hallo,

    ich habe nach einer Fileservermigration das altbekannte Problem, dass nach
    Abschaltung des alten Fileservers die Dokumente mit hinterlegten Vorlagen
    sehr lange zum Öffnen benötigen.
    Nach etwas Recherche habe ich das hier gefunden:
    http://mstech-blog.com/2012/10/30/powershell-fix-attached-template-pointing-on-network-share/

    Leider funktioniert das Skript in der Form bei mir leider nur fehlerhaft.

    Zur Info:

    Name             : ConsoleHost
    Version          : 3.0
    InstanceId       : 11400ef3-ef78-48cc-8b07-fe3b4802a72d
    UI               :
    System.Management.Automation.Internal.Host.InternalHostUserInterface
    CurrentCulture   : de-DE
    CurrentUICulture : de-DE
    PrivateData      : Microsoft.PowerShell.ConsoleHost+ConsoleColorProxy
    IsRunspacePushed : False
    Runspace         : System.Management.Automation.Runspaces.LocalRunspace

    Wenn ich das richtig sehe, habe ich demzufolge die Powershell 3.0 auf dem
    Server laufen. Zusätzlich läuft ein Office 2010 drauf. Im oben verlinkten Skript habe ich folgende Stelle geändert:

    <# for only check, comment this block #>
                     Write-Host "-- > Changing Attached Template" -ForegroundColor DarkYellow -BackgroundColor Black
                    $Doc.AttachedTemplate = $null
                    $Doc.SaveAs([ref]$file.FullName)
                    $doc.close([ref]$false)
    <# Only Check #>

    Bei jedem Dokument, welches einen UNC Pfad in der Vorlage enthält kommt aber
    leider der Fehler:
    Error while processing file: xyz.doc

    Schreiben kann ich auf der Datei, also ein Rechteproblem schließe ich aus.

    Eventuell kann mir jemand den entscheidenden Tipp geben. :)

    Vielen dank.


    Dilbert's words of wisdom #19:
    Am I getting smart with you? How would you know?


    Mittwoch, 30. Januar 2013 10:39

Antworten

  • Ich kann die leider nicht besser helfen da ich keine Dokumente mit fehlerhaften vorlagen habe und nicht verstanden habe wie diese erzeugt werden. Da musst du schon selbst testen!

    Die Fehlermeldungen sind sehr aussagekräftig !
    Der Fehler tritt in der Zeile 74 Zeichen 5 auf ! $Doc.Close() "Close" mit 0 Argument(en) !

    Die müsste aufgefallen sein das dieses einzige $Doc.Close() anders aussieht als alle anderen!
    Hier Fehlt in den Klammern das [Ref]$False ! Richtig wäre wie bei den anderen $Doc.Close([Ref]$False).

    Der Zweite Fehler sagt dir das das Document schon geschlossen ist.
    in der Zeile 69 wird das Dokument geschlossen und in der Zeile 74 wird versucht das das Dokument nochmal zu schließen das geht schief!
    Eigentlich dürfte dort keine Fehlermeldung kommen, da die Close() Methode dies Toleriert!

    Lösung für diese Problem:

    Kommentiere die Zeile 74 einfach aus (oder lösche Sie), damit sie nicht mehr ausgeführt wird!
    $Doc.Close()


    Please click “Mark as Answer” if my post answers your question and click “Vote As Helpful” if my Post helps you.
    Bitte markiere hilfreiche Beiträge von mir als “Als Hilfreich bewerten” und Beiträge die deine Frage ganz oder teilweise beantwortet haben als “Als Antwort markieren”.
    My PowerShell Blog http://www.admin-source.info
    [string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('755964655967-86965747271757624-8796158066061').substring(($_*2),2))})-replace' '
    German ? Come to German PowerShell Forum!

    Donnerstag, 31. Januar 2013 07:11

Alle Antworten

  • Hallo Norbert!

    Der Ersteller des Skriptes hat leider nicht richtig verstanden wie Try{}Catch{}Finally{} eingesetzt werden sollte. (Ich könnte da jetzt einen Vortrag halten....)
    in dem Catch-Block wird der eigentliche Fehler (Exception) einfach weg geschluckt und durch eine nichts sagenden Meldung ausgetauscht.
    Schreib bitte mal in den Catch-Block $Error[0] um den zuletzt erzeugten eigentlichen Fehler anzeigen zu lassen.

    catch {
      $Error[0]
      Write-Host "Error while processing file: " $file.FullName
      $Doc.Close($false)
      $Word.Quit($false)
    }


    Please click “Mark as Answer” if my post answers your question and click “Vote As Helpful” if my Post helps you.
    Bitte markiere hilfreiche Beiträge von mir als “Als Hilfreich bewerten” und Beiträge die deine Frage ganz oder teilweise beantwortet haben als “Als Antwort markieren”.
    My PowerShell Blog http://www.admin-source.info
    [string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('755964655967-86965747271757624-8796158066061').substring(($_*2),2))})-replace' '
    German ? Come to German PowerShell Forum!

    Mittwoch, 30. Januar 2013 11:45
  • Am 30.01.2013 schrieb Peter Kriegel:

    Hallo Peter,

    Der Ersteller des Skriptes hat leider nicht richtig verstanden wie Try{}Catch{}Finally{} eingesetzt werden sollte. (Ich könnte da jetzt einen Vortrag halten....)
    in dem Catch-Block wird der eigentliche Fehler (Exception) einfach weg geschluckt und durch eine nichts sagenden Meldung ausgetauscht.

    Ich sollte vorausschicken, dass ich CPM kann (copy paste and modify). Also
    bitte gern erklären, aber mein Aufnahmelevel in der Hinsicht ist begrenzt.
    ;)

    Schreib bitte mal in den Catch-Block $Error[0] um den zuletzt erzeugten eigentlichen Fehler anzeigen zu lassen.

    So, hab ich getan. Folgende Fehlermeldung:
    Argument: "1" muss System.Management.Automation.PSReference sein. Verwenden
    Sie [ref].
    In C:\Preinst\ps_fix_attached_template.ps1:113 Zeichen:3
    +   $Doc.Close($false)
    +   ~~~~~~~~~~~~~~~~~~
        + CategoryInfo          : NotSpecified: (:) [], MethodException
        + FullyQualifiedErrorId : NonRefArgumentToRefParameterMsg

    Hoffe, damit kannst du was anfangen.

    Bye
    Norbert


    Dilbert's words of wisdom #18:
    Never argue with an idiot. They drag you down to their level then beat you
    with experience.

    Mittwoch, 30. Januar 2013 12:25
  • Irgendwie ist meine erste Antwort bisher noch nicht angekommen, deswegen ggf. doppelt

    Hallo Peter,

    > Der Ersteller des Skriptes hat leider nicht richtig verstanden wie Try{}Catch{}Finally{} eingesetzt werden sollte. (Ich könnte da jetzt einen Vortrag halten....)
    > in dem Catch-Block wird der eigentliche Fehler (Exception) einfach weg geschluckt und durch eine nichts sagenden Meldung ausgetauscht.

    Ich sollte vorausschicken, dass ich CPM kann (copy paste and modify). Also
    bitte gern erklären, aber mein Aufnahmelevel in der Hinsicht ist begrenzt.
    ;)

    > Schreib bitte mal in den Catch-Block $Error[0] um den zuletzt erzeugten eigentlichen Fehler anzeigen zu lassen.

    So, hab ich getan. Folgende Fehlermeldung:
    Argument: "1" muss System.Management.Automation.PSReference sein. Verwenden
    Sie [ref].
    In C:\Preinst\ps_fix_attached_template.ps1:113 Zeichen:3
    +   $Doc.Close($false)
    +   ~~~~~~~~~~~~~~~~~~
        + CategoryInfo          : NotSpecified: (:) [], MethodException
        + FullyQualifiedErrorId : NonRefArgumentToRefParameterMsg

    Hoffe, damit kannst du was anfangen.

    Bye
    Norbert

    Mittwoch, 30. Januar 2013 14:52
  • Ja die TechNet Server sind manchmal sehr langsam ...

    Der Fehler ist bekannt und taucht nur bei Word 2010 (V.14) und der PS 3.0 auf.

    http://stackoverflow.com/questions/12199692/word-application-comobject-errors-in-powershell
    http://richardspowershellblog.wordpress.com/2012/10/15/powershell-3-and-word/

    Bei allen vorkommenden Stellen das [REF] reinschreiben.
    $Doc.Close([Ref]$false)
    $Word.Quit([Ref]$false)


    Und eventuell nicht SaveAs(<Pfad>) benutzen sondern nur Save() ohne Pfadangabe, da die Datei ja über den Pfad geöffnet wurde.
    $Doc.SaveAs($file.FullName)
    $Doc.Save()


    Please click “Mark as Answer” if my post answers your question and click “Vote As Helpful” if my Post helps you.
    Bitte markiere hilfreiche Beiträge von mir als “Als Hilfreich bewerten” und Beiträge die deine Frage ganz oder teilweise beantwortet haben als “Als Antwort markieren”.
    My PowerShell Blog http://www.admin-source.info
    [string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('755964655967-86965747271757624-8796158066061').substring(($_*2),2))})-replace' '
    German ? Come to German PowerShell Forum!



    Mittwoch, 30. Januar 2013 15:37
  • Vielen Dank, aber ich verzweifel hier grad. ;) Liegt auch an der jedesmal relativ langen Prüfzeit, die man braucht bis dann doch wieder ein Fehler aufpoppt.

    Ich kopier mal mein jetziges Skript hier rein.

    ## =====================================================================
    ## Title     	: ps_fix_attached_template.ps1
    ##
    ## Author		: andiexer
    ## Date			: 30.10.2012
    ## Version		: 1.1
    ## Web			: www.mstech-blog.com
    ## ====================================================================
    
    $folderPath = "c:\preinst\"
    $csvPath = "C:\preinst\files.csv"
    [int]$wrongTemplates = 0
    [array]$wrongDocuments = @()
    
    
    # Get all files recursive in folder 
    $Files = Get-ChildItem -Include *.doc,*.docx -Recurse -Path $FolderPath 
    
    Write-Host "<=== Start Script"(Get-Date -Format hh:mm:ss)"===>" -BackgroundColor DarkRed -ForegroundColor White
    
    foreach($file in $Files)
    {
    	try
    	{
    		$paramIsFullPath = $false
    		$paramIsCorrupted = $false
    	
    		# save original timestamps
    		$creationTime = $file.CreationTime
    		$lastWriteTime = $file.LastWriteTime
    		$lastAccessTime = $file.LastAccessTime
    	
    		# Open Word Instance
    		$Word = New-Object -ComObject "Word.Application"
    		$word.Visible = $false
    		
    		$Doc = $word.Documents.Open($file.FullName)
    		# Parse XML
    		$xml = [xml]$Doc.WordOpenXML
    		
    		$TemplatePath = $null
    		
    		# Get Templatepath
    		$TemplatePath = ($xml.GetElementsByTagName("Relationship") | ? {$_.Type -like "*attachedTemplate"} | select target).target
    		if($TemplatePath -eq $null)
    		{
    			$TemplatePath = ($xml.GetElementsByTagName("Template") | select innerText).innerText
    		}
    		
    		# Remove ilegal characters
    		$TemplatePath = $TemplatePath.Replace("%20"," ")
    		$TemplatePath = $TemplatePath.Replace("file:///","")
    		
    		
    		if([System.IO.Path]::IsPathRooted($TemplatePath))
    		{
    			# Check if Path is UNC
    			if($TemplatePath.StartsWith("\\"))
    			{
    			
    				$paramIsFullPath = $true
    				$paramIsCorrupted = $true
    				Write-Host "File with broken template: $($file.Fullname) - [$TemplatePath]"
    				
    				<# for only check, comment this block #>
    				 Write-Host "-- > Changing Attached Template" -ForegroundColor DarkYellow -BackgroundColor Black
    				 $doc.set_AttachedTemplate([ref]$null)
    				 $Doc.Save()
    			         $Doc.Close([Ref]$false)
    				<# Only Check #>
    				
    				
    				# Close Document and Quit Word Instance
    				$Doc.Close()
    				$Word.Quit([Ref]$false)
    				
    				<# for only check, comment this block #>
    				# Set original timestamps
    				 $file.CreationTime = $creationTime
    				 $file.LastWriteTime = $LastWriteTime
    				 $file.LastAccessTime = $LastAccessTime
    				<# Only Check #>
    				
    				
    				# +1 changedTemplate
    				$wrongTemplates++
    			
    			}
    			else
    			{
    				# Document with a correct attached fullpath template 
    				Write-Host "File with correct fullpath template: $($file.Fullname) - [$TemplatePath]"
    				$paramIsFullPath = $true
    				$Doc.Close([Ref]$false)
    				$Word.Quit([Ref]$false)
    			}
    			
    	
    		}
    		else
    		{
    			# Document with attached template without fullpath 
    			Write-Host "File with no fullpath template: $($file.Fullname) - [$TemplatePath]"
    			$Doc.Close([Ref]$false)
    			$Word.Quit([Ref]$false)
    		}
    		
    
    	}
    	catch {
      $Error[0]
      Write-Host "Error while processing file: " $file.FullName
      $Doc.Close([Ref]$false)
      $Word.Quit([ref]$false)
    }
    	finally
    	{	
    		# Create Object for Array
    		$document = New-Object PSObject -Property @{
    			DocFullName = $file.FullName
    			isFullPath = $paramIsFullPath
    			isCorrupted = $paramIsCorrupted
    			AttachedTemplate = $TemplatePath
    		}
    		
    		# add to array
    		$wrongDocuments += $document
    		
    		# clear object
    		$document = $null
    		
    		# Garbage Collect0r
    		[gc]::collect() 
    		[gc]::WaitForPendingFinalizers()
    	}
    }
    
    Write-Host "<=== Finished Script"(Get-Date -Format hh:mm:ss)"===>" -BackgroundColor DarkRed -ForegroundColor White
    Write-Host "<=== Changed Templates: $wrongTemplates ===>" -BackgroundColor DarkRed -ForegroundColor White
    $wrongDocuments | Export-Csv -Delimiter ";" -Encoding "UTF8" -Path $csvPath

    Das ist der Fehler der jetzt auftaucht:

    <=== Start Script 11:28:51 ===>
    File with broken template: C:\preinst\Dokument.doc - [\\alterserver\
    user$\Schulz\Vorlagen\Vorlage.dot]
    -- > Changing Attached Template
    Ausnahme beim Aufrufen von "Close" mit 0 Argument(en):  "Das aufgerufene Objekt wurde von den Clients getrennt.
    (Ausnahme von HRESULT: 0x80010108 (RPC_E_DISCONNECTED))"
    In C:\Preinst\ps_fix_attached_template.ps1:74 Zeichen:5
    +                 $Doc.Close()
    +                 ~~~~~~~~~~~~
        + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
        + FullyQualifiedErrorId : COMException

    Error while processing file:  C:\preinst\Dokument.doc
    Ausnahme beim Aufrufen von "Close" mit 1 Argument(en):  "Das aufgerufene Objekt wurde von den Clients getrennt.
    (Ausnahme von HRESULT: 0x80010108 (RPC_E_DISCONNECTED))"
    In C:\Preinst\ps_fix_attached_template.ps1:113 Zeichen:3
    +   $Doc.Close([Ref]$false)
    +   ~~~~~~~~~~~~~~~~~~~~~~~
        + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
        + FullyQualifiedErrorId : COMException

    <=== Finished Script 11:31:50 ===>
    <=== Changed Templates: 0 ===>

    Ich hoffe, mir kann irgendwie geholfen werden. :)

    Danke

    Norbert

    Mittwoch, 30. Januar 2013 22:37
  • Ich kann die leider nicht besser helfen da ich keine Dokumente mit fehlerhaften vorlagen habe und nicht verstanden habe wie diese erzeugt werden. Da musst du schon selbst testen!

    Die Fehlermeldungen sind sehr aussagekräftig !
    Der Fehler tritt in der Zeile 74 Zeichen 5 auf ! $Doc.Close() "Close" mit 0 Argument(en) !

    Die müsste aufgefallen sein das dieses einzige $Doc.Close() anders aussieht als alle anderen!
    Hier Fehlt in den Klammern das [Ref]$False ! Richtig wäre wie bei den anderen $Doc.Close([Ref]$False).

    Der Zweite Fehler sagt dir das das Document schon geschlossen ist.
    in der Zeile 69 wird das Dokument geschlossen und in der Zeile 74 wird versucht das das Dokument nochmal zu schließen das geht schief!
    Eigentlich dürfte dort keine Fehlermeldung kommen, da die Close() Methode dies Toleriert!

    Lösung für diese Problem:

    Kommentiere die Zeile 74 einfach aus (oder lösche Sie), damit sie nicht mehr ausgeführt wird!
    $Doc.Close()


    Please click “Mark as Answer” if my post answers your question and click “Vote As Helpful” if my Post helps you.
    Bitte markiere hilfreiche Beiträge von mir als “Als Hilfreich bewerten” und Beiträge die deine Frage ganz oder teilweise beantwortet haben als “Als Antwort markieren”.
    My PowerShell Blog http://www.admin-source.info
    [string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('755964655967-86965747271757624-8796158066061').substring(($_*2),2))})-replace' '
    German ? Come to German PowerShell Forum!

    Donnerstag, 31. Januar 2013 07:11
  • Am 31.01.2013 schrieb Peter Kriegel:
    Hi Peter,

    Lösung für diese Problem:

    Kommentiere die Zeile 74 einfach aus (oder lösche Sie), damit sie nicht mehr ausgeführt wird!
    $Doc.Close()

    Super. Danke für den Tipp. Damit hats endlich funktioniert.

    Bye
    Norbert


    Dilbert's words of wisdom #19:
    Am I getting smart with you? How would you know?

    Donnerstag, 31. Januar 2013 19:42
  • Hallo Miteinander

    Ich habe nach einer Fileserver Migration dasselbe Problem. Bereits erstellte Vorlagen finden die Vorlage nicht mehr. Ich habe versucht aus obigem Script schlau zu werden. Leider habe ich von Powershell (noch) keine Ahnung und es ist dringend. Kann mir jemand sagen, wie ich das Script abändern kann damit es folgende Änderungen vornimmt.

    Es sollte die Dokumente am neuen Speicherort Z:\02_Vorlagen\verschiedene Unterordner mit Word Dokumenten durchsuchen und bei allen Dokumenten die den Pfad X:\Dokumente\Vorlagen\verschiedene Unterordner haben denn Teil X:\Dokumente\Vorlagen durch Z:\02_Vorlagen ändern.

    Vielen Dank

    Montag, 10. März 2014 05:59
  • Ich habe es mit PowerShell nicht hinbekommen.

    Hier kommt PowerShell mit den COM Objekten nicht so gut klar wie z.B. Visual Basic Script.

    Deshalb mach das am besten damit!

    Siehe hier Methode 3:

    http://support.microsoft.com/kb/830561/en-us


    PowerShell Artikel, Buchtipps und kostenlose PowerShell Tutorials + E-Books
    auf der deutschsprachigen PowerShell Community

    Mein 21 Teiliger PowerShell Video Grundlehrgang
    Deutsche PowerShell Videos auf Youtube
    Folge mir auf:
    Twitter | Facebook | Google+

    Montag, 10. März 2014 15:36