Ordnerstruktur lesen, Dateien - Neue Ordnerstruktur
Ich verzweifle etwas an folgender Sache.
Ich habe eine vorgebene Ordnerstruktur, in der sich Dateien befinden. Diese Dateien sollen im Hintergrund per Word geöffnet werden, dann als .docx abgespeichert werden.
Jedoch darf die Ordnerstruktur nicht verändert werden.
Im Klartext also:
$quelle = "c:\beispiel\dateien"
Im Ordner "dateien" befinden sich als Beispiel Unterordner, wie:
"......\dateien\X123\test.dfa"
"......\dateien\X124\test.dfa"
"......\dateien\X125\test.dfa"
Nach der Bearbeitung müssen sie am Ziel aber genauso wieder erscheinen, ebenso die geänderten Dateien darin gespeichert werden.
$ziel = "d:\bearbeitet\pdf"
"......\docx\X123\test.pdf"
"......\docx\X124\test.pdf"
"......\docx\X125\test.pdf"
Wie kann ich das per Code umsetzen?
Mein Hauptproblem liegt also darin, dass die Dateien die im Quellordner geöffnet und dann über Word bearbeitet werden, auch genauso wieder im richtigen Zielordner abzuspeichern, so dass die Ordnerstruktur Quelle/Ziel gleich ist
Ich habe eine vorgebene Ordnerstruktur, in der sich Dateien befinden. Diese Dateien sollen im Hintergrund per Word geöffnet werden, dann als .docx abgespeichert werden.
Jedoch darf die Ordnerstruktur nicht verändert werden.
Im Klartext also:
$quelle = "c:\beispiel\dateien"
Im Ordner "dateien" befinden sich als Beispiel Unterordner, wie:
"......\dateien\X123\test.dfa"
"......\dateien\X124\test.dfa"
"......\dateien\X125\test.dfa"
Nach der Bearbeitung müssen sie am Ziel aber genauso wieder erscheinen, ebenso die geänderten Dateien darin gespeichert werden.
$ziel = "d:\bearbeitet\pdf"
"......\docx\X123\test.pdf"
"......\docx\X124\test.pdf"
"......\docx\X125\test.pdf"
Wie kann ich das per Code umsetzen?
$quelle = "c:\beispiel\dateien"
$ziel = "d:\bearbeitet\docx"
$test= dir $quelle -Include *.* -Recurse | foreach {
$zielDir = $_.DirectoryName.Replace($quelle,$ziel)
new-item -ItemType Directory -Path $zielDir -Force
$filepath = ??????????????????
}
foreach ($docxfile in $test)
{
$objword = New-Object -ComObject word.application
$selection = $objword.Selection
$selection.Font.Name = Arial
$selection.Font.Size =9
$printout_pagesize = "A4"
$selection.PageSetup.PaperSize = [Microsoft.Office.Interop.Word.WdPaperSize]::$printout_pagesize
$selection.PageSetup.Orientation = $printout_page_set
$doc.SaveAs([ref]$filepath, [ref]17) #17 steht für PDF
$doc.Saved = $true
$doc.Close()
$objword.Quit()
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($objword)
}
Mein Hauptproblem liegt also darin, dass die Dateien die im Quellordner geöffnet und dann über Word bearbeitet werden, auch genauso wieder im richtigen Zielordner abzuspeichern, so dass die Ordnerstruktur Quelle/Ziel gleich ist
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 255703
Url: https://administrator.de/forum/ordnerstruktur-lesen-dateien-neue-ordnerstruktur-255703.html
Ausgedruckt am: 06.04.2025 um 19:04 Uhr
7 Kommentare
Neuester Kommentar
Moinsens,
hatte ich dir hier schon geschrieben wie du dies bewerkstelligst:
Powershell: Dateien suchen, Ordner, Unterordner
Genauer gesagt dort in der Zeile 16
Hier mit gleichzeitiger Änderung der Erweiterung zu *.pdf:
anders für dich vielleicht verständlicher geschrieben
Grüße Uwe
p.s. schau dir doch mal alle Eigenschaften eines File-Objektes an, dann stehst du bei solchen Aufgaben nicht immer wie der Ochs vorm Berg
hatte ich dir hier schon geschrieben wie du dies bewerkstelligst:
Powershell: Dateien suchen, Ordner, Unterordner
Genauer gesagt dort in der Zeile 16
Hier mit gleichzeitiger Änderung der Erweiterung zu *.pdf:
$filepath = "$zielDir\$($_.Basename).pdf"
$filepath = $zielDir + "\" + $_.Basename + ".pdf"
p.s. schau dir doch mal alle Eigenschaften eines File-Objektes an, dann stehst du bei solchen Aufgaben nicht immer wie der Ochs vorm Berg
hier ging es ja erst einmal nur um eine Grundsatzfrage deinerseits nämlich deine Zeile mit den Fragezeichen ...mehr hatte ich mir nicht angesehen.
in dem du das File zum PDF wandelst ! D.h. $zielDir hat nach deiner ersten Schleife immer den selben Inhalt.
Also machst du es z.B. nach diesem Schema ...
Viel Erfolg
Er legt die Ordner an, er fängt an die Dateien zu formatieren, dann aber kommt schon mal ein Fehler, dass er alle Dateien in einem Ordner speichert und nicht so, wie er sie ausliest.
weil du in deinem ersten Code die erste Schleife nicht um deinen kompletten Code legst Also machst du es z.B. nach diesem Schema ...
$pfad_allgemein = "c:\quelle"
$pfad_allgemein_pdf = "d:\bearbeitet"
$pfad_allgemein_pdf_a = "d:\bearbeitet\pdfa"
$DATDateien = gci -Path $pfad_allgemein -Include *.df1, *.dx1, *.ff1 -recurse
$objword = New-Object -ComObject word.application
$objword.visible = $false
$objword.DisplayAlerts = $false
foreach($used_dat in $DATDateien){
$zielDir = $used_dat.DirectoryName.Replace($pfad_allgemein, $pfad_allgemein_pdf)
Write-Host "Zielverzeichnis "$zielDir
If(!(Test-Path $zielDir)){new-item -ItemType Directory -Path $zielDir -Force}
$filepath = Join-Path -Path $zielDir -ChildPath ($used_dat.name + ".pdf")
$doc = $objword.documents.Open($used_dat.FullName)
$objword.selection.pagesetup.topmargin = 30
$objword.selection.pagesetup.leftmargin = 20
$objword.selection.pagesetup.rightmargin = 10
$objword.selection.pagesetup.bottommargin = 30
$selection = $objword.Selection
$selection.Font.Name = $schriftart
$selection.Font.Size = $schriftart_groesse_allgmein
$printout_pagesize = "wdPaper$seite_groesse"
$selection.PageSetup.PaperSize = [Microsoft.Office.Interop.Word.WdPaperSize]::$printout_pagesize
$selection.PageSetup.Orientation = $printout_page_set
$doc.SaveAs([ref]$filepath, [ref]17) #17 steht für PDF
$doc.Saved = $true
$doc.Close()
}
$objword.DisplayAlerts = $true
$objword.Quit()
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($objword)
Und ich finde zum Teufel komm raus den Fehler nicht.. es ist ggrrrrrrr.
wäre schön wenn du mal die Fehlermeldungen posten würdest, sonst muss ich mir hier immer den Hals verbiegen Mache alles immer Schritt für Schritt und gebe Variablen auf der Konsole aus, dann findest du deinen Fehler schon.
PDFCreator verwende ich nicht, deshalb kann ich dir da gerade nicht weiterhelfen, sehe auch nirgends das dieser irgendwo in deinem Code Verwendung findet...und woher die Variable $pdftool_x86 etc. kommen kann ich deinem Code auch nicht entnehmen, sorry. Eventuell Fehlen hier Leerzeichen hinter /IF und /OF.
p.s. geht jetzt eigentlich wieder am Thema des Threads vorbei, und mutiert zu einem Multi-Fragen-Thread !
Mach es doch wie oben bereits geschrieben alles in einer einzigen Schleife zusammen:
Also ungetestet (da kein PDF Creator vorhanden) etwa so.
Und zur Info, das "clearen" der COM-Objekte bei jedem Schleifendurchlauf solltest du nicht machen, das kostet unnötig Zeit. Einmal am Anfang erstellen und zum Schluss einmal freigeben, reicht
p.s. Nutze zur besseren Strukturierung, Codeeinrückungen, so verlierst du nicht den Überblick ...du hast vermutlich nur einen Flüchtigkeitsfehler in deinem Code...
so i`m out here now, check the doc's !
Viel Erfolg noch
Grüße Uwe
Also ungetestet (da kein PDF Creator vorhanden) etwa so.
$pfad_allgemein = "c:\quelle"
$pfad_allgemein_pdf = "d:\bearbeitet"
$pfad_allgemein_pdf_a = "d:\bearbeitet\pdfa"
$pdftool_x86 = "$($env:ProgramFiles)\PDFCreator\PDFCreator.exe"
$pdftool_x64 = "$(${env:ProgramFiles(x86)})\PDFCreator\PDFCreator.exe"
$DATDateien = gci -Path $pfad_allgemein -Include *.df1, *.dx1, *.ff1 -recurse
$oPDFCreator = New-Object -ComObject "PDFCreator.clsPDFCreator"
$objword = New-Object -ComObject word.application
$objword.visible = $false
$objword.DisplayAlerts = $false
foreach($used_dat in $DATDateien){
# Pfade setzen ------
$zielDir = $used_dat.DirectoryName.Replace($pfad_allgemein, $pfad_allgemein_pdf)
$zielDir_pdf_a = $used_dat.DirectoryName.Replace($pfad_allgemein,$pfad_allgemein_pdf_a)
If(!(Test-Path $zielDir)){new-item -ItemType Directory -Path $zielDir -Force}
If(!(Test-Path $zielDir_pdf_a)){new-item -ItemType Directory -Path $zielDir_pdf_a -Force}
$filepath_pdf = Join-Path -Path $zielDir -ChildPath ($used_dat.name + ".pdf")
$filepath_pdf_a = Join-Path -Path $zielDir_pdf_a -ChildPath ($used_dat.name + ".pdf")
# ---------------------
# Word-Umwandlung -------------
$doc = $objword.documents.Open($used_dat.FullName)
$objword.selection.pagesetup.topmargin = 30
$objword.selection.pagesetup.leftmargin = 20
$objword.selection.pagesetup.rightmargin = 10
$objword.selection.pagesetup.bottommargin = 30
$selection = $objword.Selection
$selection.Font.Name = $schriftart
$selection.Font.Size = $schriftart_groesse_allgmein
$printout_pagesize = "wdPaper$seite_groesse"
$selection.PageSetup.PaperSize = [Microsoft.Office.Interop.Word.WdPaperSize]::$printout_pagesize
$selection.PageSetup.Orientation = $printout_page_set
$doc.SaveAs([ref]$filepath_pdf, [ref]17) #17 steht für PDF
$doc.Saved = $true
$doc.Close()
# ----------------------------
# PDFa umwandlung ------------
if (Test-Path $pdftool_x86){
Start-Process $pdftool_x86 ('/IF"' + $filepath_pdf + '" /OF"' + $filepath_pdf_a + '" /NoStart /OutputSubFormat"PDF/A-1b"')
}else{
Start-Process $pdftool_x64 ('/IF"' + $filepath_pdf + '" /OF"' + $filepath_pdf_a + '" /NoStart /OutputSubFormat"PDF/A-1b"')
}
# -----------------------------
}
$objword.DisplayAlerts = $true
$objword.Quit()
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($objword)
[System.Runtime.InteropServices.Marshal]::ReleaseComObject($oPDFCreator)
Und zur Info, das "clearen" der COM-Objekte bei jedem Schleifendurchlauf solltest du nicht machen, das kostet unnötig Zeit. Einmal am Anfang erstellen und zum Schluss einmal freigeben, reicht
p.s. Nutze zur besseren Strukturierung, Codeeinrückungen, so verlierst du nicht den Überblick ...du hast vermutlich nur einen Flüchtigkeitsfehler in deinem Code...
so i`m out here now, check the doc's !
Viel Erfolg noch
Grüße Uwe