131071
Goto Top

Nach Domain Change Pfade anpassen

Hallo zusammen

Wir haben mehrere Unternehmen bzw. Domains zusammengeführt und haben nun das Problem, dass gewisse verknüpfte Elemente (Bilder in Word Docs) nicht mehr angezeigt werden, da diese Dateien im SYSVOL der alten Domain gespeichert wurden.
In den Word Docs ist z.B. ein Bild gespeichert, dessen Pfad lautet: \\alteDomain.local\SYSVOL\alteDomain.local\Bilder
Nun gibt es ja diese alteDomain.local nicht mehr und folglich kann das Bild nicht mehr dargestellt werden.
Ich sehe eigentlich zwei mögliche Ansätze:
1) Ich erstelle einen DNS Eintrag alteDomain.local, der auf irgend eine Freigabe auf unserem Fileserver zeigt mit dem obigen Pfad, so dass die Bilder in der Theorie wieder angezeigt werden sollten (leider scheitere ich im Moment daran, da auch ein CNAME Eintrag nicht mit einem Punkt erstellt werden kann (alteDomain.local)
2) Ich ändere die Pfade mit einem Powershell oder VBA Script

Hat mir irgend jemand Tipps zu meinen Ideen oder sieht er womöglich eine einfachere Lösung anstelle alle Dokumenten von Hand zu ändern?

Besten Dank im Voraus für die Rückmeldungen!

Content-Key: 316840

Url: https://administrator.de/contentid/316840

Printed on: April 19, 2024 at 22:04 o'clock

Member: falscher-sperrstatus
falscher-sperrstatus Oct 04, 2016 at 09:43:10 (UTC)
Goto Top
Hallo,

auf Dauer macht die Änderung aller Dateien am meisten Sinn. Und in Zukunft solche Dateien besser nicht im Domainshare ablegen.

VG,

Christian
Member: colinardo
colinardo Oct 04, 2016 updated at 09:51:33 (UTC)
Goto Top
Hallo dmncng.
Habe ich hier schon diverse Skripte sowohl für Word- als auch Excel-Dokumente gepostet welche genau das machen:

Es macht also immer erst mal Sinn unsere Suchfunktion zu nutzen!

Grüße Uwe
Mitglied: 131071
131071 Oct 04, 2016 at 10:20:52 (UTC)
Goto Top
Hallo Uwe

Danke für deine Links. Wenn ich deine Posts durchlese, dann geht es ja da immer um die Anpassung der Vorlage. Ich kenne mich leider nicht aus mit VBA und wüsste jetzt auch überhaupt nicht, was ich anpassen muss, damit deine Scripts auch für mein Problem funktionieren. Hast du mir evtl. einen Tipp, wie ich das ganze angehen kann mit dem Anpassen des Scripts?

Besten Dank im Voraus und Grüsse!
Mitglied: 131026
131026 Oct 04, 2016 updated at 10:24:43 (UTC)
Goto Top
Moin
wie ich das ganze angehen kann mit dem Anpassen des Scripts?
Wie wär's erst mal mit ausführlichem "Lesen" der Posts ? face-smile

R.
Member: colinardo
colinardo Oct 04, 2016 at 10:36:02 (UTC)
Goto Top
Zitat von @131026:
Wie wär's erst mal mit ausführlichem "Lesen" der Posts ? face-smile
Dito.
Mitglied: 131071
131071 Oct 04, 2016 at 11:51:11 (UTC)
Goto Top
Danke, keine Angst hatte deine Links durchgelesen.
Es sind DOC's, also muss ich es mit dem VBS Script ausführen, aber das ändert ja nur die Vorlage?!

'Pfad zu den Dokumenten  
Const strPathDocs = "\\fileserver\docs"  
'Logfile für eventuell auftretende Fehler  
Const strPathLogfile = "c:\logfile.txt"  
'Alter Servername  
Const strOldServer = "\\alteDomain.local"  
'Neuer Servername  
Const strNewServer = "\\fileserver"   

Set fso = Wscript.CreateObject("Scripting.Filesystemobject")  
Set objWord = WScript.CreateObject("Word.Application")  
'Wenn das ganze unsichtbar ablaufen soll nächste Zeile auf false setzen  
objWord.Visible = True
objWord.DisplayAlerts = 0
'Im Ordner Rekursiv alle Word-Dokumente verarbeiten  
parseFolders fso.GetFolder(strPathDocs), True
objWord.DisplayAlerts = -1
objWord.Quit True
Set fso = Nothing
Set objWord = Nothing

Function parseFolders(fldr, boolRecursion)
    
    For Each file In fldr.Files
   		'Verarbeite nur Dateien mit den Endungen *.doc, *.docx, *.docm   
        If LCase(Right(file.Name, 3)) = "doc" Or LCase(Right(file.Name, 4)) = "docx" Or LCase(Right(file.Name, 4)) = "docm" Then  
            On Error Resume Next
            Set objDoc = objWord.Documents.Open(file.Path)
            If Err.Number <> 0 Then
            	Set objLog = fso.OpenTextFile(strPathLogfile,8,True)
            	objLog.WriteLine("Fehler beim öffnen der Datei: -> " & file.Path)  
            	objLog.Close
            Else
              Set dlgTemplate = objWord.Dialogs(87)
              If InStr(1,dlgTemplate.Template,strOldServer,1) Then
                        ' neuen Templatepfad erstellen  
	            	newTemplate = Replace(dlgTemplate.Template,strOldServer,strNewServer,1,1,1)
	            	' Alle alten Vorlageninformationen entfernen  
	            	objDoc.RemoveDocumentInformation (9)
	            	' Neue Vorlage zuweisen  
	            	objDoc.AttachedTemplate = newTemplate
		        ' Dokument speichern  
		        objDoc.Save
		        objDoc.Close True
	      Else
	       		objDoc.Close False
              End If
            End if
        End If
    Next
    
    If boolRecursion Then
		For Each subFolder in fldr.SubFolders
			parseFolders subFolder, True
		Next
	End If
End Function
Member: colinardo
Solution colinardo Oct 04, 2016, updated at Oct 05, 2016 at 09:19:33 (UTC)
Goto Top
Ich würde das per Powershell machen wie ich es in den Links für die Excel-Files gezeigt habe. Minimal für Word abzuändern um den alten Servernamen in verlinkten Dateien im Dokument auszutauschen:

Ohne Gewähr, da ich hier nicht für alle Verlinkungsfälle Testdateien habe.
Verarbeitet werden nur *.docx und *.docm Dateien, keine Dateien im alten binären *.doc Format, für dieses siehe VBA Skript weiter unten.
# --- Variablen ---------------------------
# Alter und neuer Servername angeben
$serverold = "\\oldserver"  
$servernew = "\\newserver"  

# Ordner der *.docx und *.docm Dateien enthält und rekursiv verarbeitet wird
$folder = "D:\word-dateien"  
# --------------------------------------

# Benötigt wird mindestens NET-Framework 4.5 und Powershell 3.0
if ($PSVersionTable.PSVersion.Major -lt 3){write-host "ERROR: Minimum Powershell Version 3.0 is required!" -F Yellow; return}   

# benötigte Assemblies laden
Add-Type -AssemblyName System.IO.Compression
Add-Type -AssemblyName System.IO.Compression.Filesystem

gci "$folder\*" -Include '*.docx','*.docm' -File -Recurse | %{  
    # Excel File als ZIP-Datei im Update-Modus öffnen
    $zipfile = [System.IO.Compression.ZipFile]::Open($_.FullName,[System.IO.Compression.ZipArchiveMode]::Update)
    
    # Einträge der benötigte Dateien aus dem Dokument holen
    $entries = $zipfile.Entries | ?{$_.FullName -match '^word/_rels/.*?\.rels$'}  
    $remove = @()
    $entries | %{
        $tmp = "$env:TEMP\$($_.Name)"  
        if (Test-Path $tmp){del $tmp -Force -ErrorAction SilentlyContinue}
        
        # file entry extrahieren
        [System.IO.Compression.ZipFileExtensions]::ExtractToFile($_,$tmp)

        $content = gc $tmp
        if ($content -match [regex]::Escape($serverold)){
            # Einträge ersetzen
            $content -replace [regex]::Escape($serverold),$servernew | Set-Content $tmp -Encoding UTF8
            # geänderte Datei wieder hinzufügen
            [System.IO.Compression.ZipFileExtensions]::CreateEntryFromFile($zipfile,$tmp,$_.FullName) | out-null
            $remove += $_
        }
        # Temporäre Files löschen
        del $tmp -Force -ErrorAction SilentlyContinue
    }
    # lösche ersetzte Dokumentteile im ZIP
    $remove | %{$_.Delete()}
    #>

    # Zipfile-Resourcen freigeben
    $zipfile.Dispose()
}

Für die binären Formate *.doc hier das VBA Skript:
'Pfad zu den Dokumenten  
Const strPathDocs = "D:\Daten"  
'Logfile für eventuell auftretende Fehler  
Const strPathLogfile = "D:\Daten\logfile.txt"  
'Alter Servername  
Const strOldServer = "\\SERVEROLD"  
'Neuer Servername  
Const strNewServer = "\\SERVERNEW"   

If MsgBox("Wollen sie nun alle Word-Dokumente unterhalb von '" & strPathDocs & "' verarbeiten und die Stapelverarbeitung starten?",vbQuestion Or vbYesNo) = vbNo Then  
	WScript.Quit
End If

'Objekte erstellen  
Set fso = CreateObject("Scripting.Filesystemobject")  
Set objWord = WScript.CreateObject("Word.Application")  
'Wenn das ganze unsichtbar ablaufen soll nächste Zeile auf false setzen  
objWord.Visible = True
objWord.DisplayAlerts = False
On Error Resume Next
'Im Ordner Rekursiv alle Word-Dokumente verarbeiten  
parseFolders fso.GetFolder(strPathDocs), True
objWord.DisplayAlerts = True
objWord.Quit True
MsgBox "Vorgang abgeschlossen.",vbInformation  
Set fso = Nothing
Set objWord = Nothing

Function parseFolders(fldr, boolRecursion)
    For Each file In fldr.Files
   		'Verarbeite nur Dateien mit den Endungen *.doc, *.docx, *.docm   
        If LCase(Right(file.Name, 3)) = "doc" Or LCase(Right(file.Name, 4)) = "docx" Or LCase(Right(file.Name, 4)) = "docm" Then  
            doc_changed = False
            Set objDoc = objWord.Documents.Open(file.Path)
            If Err.Number <> 0 Then
            	'Wenn Fehler beim Öffnen des Dokuments aufgetreten ist notiere das im Logfile  
            	Set objLog = fso.OpenTextFile(strPathLogfile,8,True)
            	objLog.WriteLine("Fehler beim öffnen der Datei: -> " & file.Path)  
            	objLog.Close
            	Err.Clear
            Else
            	With objDoc
	              ' Dokumentvorlage überprüfen und ersetzen  
	              Set dlgTemplate = objWord.Dialogs(87)
	              If InStr(1,dlgTemplate.Template,strOldServer,1) Then    
	                    ' neuen Templatepfad erstellen  
		            	newTemplate = Replace(dlgTemplate.Template,strOldServer,strNewServer,1,1,1)
		            	' Alle alten Vorlageninformationen entfernen  
		            	.RemoveDocumentInformation (9)
		            	' Neue Vorlage zuweisen  
		            	.AttachedTemplate = newTemplate
		            	doc_changed = True
	              End If
	              
	              ' Verknüpfungen im Dokument überprüfen und ersetzen  
	              For Each story In .StoryRanges
		            For Each shape In story.InlineShapes
		                If Not shape.LinkFormat Is Nothing Then
		                    strFullPath = shape.LinkFormat.SourceFullName
		                    If InStr(1, strFullPath, strOldServer, 1) Then
		                        shape.LinkFormat.SourceFullName = Replace(strFullPath, strOldServer, strNewServer, 1, -1, 1)
		                        doc_changed = True
		                    End If
		                End If
		            Next
		          Next
		          'Wurden Änderungen vorgenommen Dokument speichern ansonsten ungespeichert schließen  
		          If doc_changed Then
			          ' Dokument speichern  
				      .Save
				      .Close True
				  Else
				  	  .Close False
				  End If
		        End With
            End if
        End If
    Next
    
    If boolRecursion Then
		For Each subFolder in fldr.SubFolders
			parseFolders subFolder, True
		Next
	End If
End Function
Für mehr Wünsche, PM dann kann ich dir ein Angebot für eine Anpassung machen.

Grüße Uwe
Mitglied: 131071
131071 Oct 04, 2016 at 13:55:18 (UTC)
Goto Top
Zitat von @131026:

Moin
wie ich das ganze angehen kann mit dem Anpassen des Scripts?
Wie wär's erst mal mit ausführlichem "Lesen" der Posts ? face-smile

R.

Danke gleichfalls, schadet nicht, alles ausführlich zu lesen bevor man so sinnvolle Posts schreibt... ;)