Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

Ordnerstruktur lesen, Dateien - Neue Ordnerstruktur

Frage Entwicklung Batch & Shell

Mitglied: internet2107

internet2107 (Level 1) - Jetzt verbinden

24.11.2014 um 14:17 Uhr, 1192 Aufrufe, 7 Kommentare, 3 Danke

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?

01.
$quelle = "c:\beispiel\dateien" 
02.
$ziel = "d:\bearbeitet\docx" 
03.
$test= dir $quelle -Include *.* -Recurse | foreach { 
04.
$zielDir = $_.DirectoryName.Replace($quelle,$ziel) 
05.
new-item -ItemType Directory -Path $zielDir -Force 
06.
$filepath = ?????????????????? 
07.
08.
 
09.
foreach ($docxfile in $test) 
10.
   {                
11.
$objword = New-Object -ComObject word.application 
12.
$selection = $objword.Selection 
13.
$selection.Font.Name = Arial 
14.
$selection.Font.Size =9 
15.
$printout_pagesize = "A4" 
16.
$selection.PageSetup.PaperSize = [Microsoft.Office.Interop.Word.WdPaperSize]::$printout_pagesize 
17.
$selection.PageSetup.Orientation = $printout_page_set 
18.
$doc.SaveAs([ref]$filepath, [ref]17) #17 steht für PDF 
19.
$doc.Saved = $true 
20.
$doc.Close() 
21.
$objword.Quit() 
22.
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($objword) 
23.
 
24.
25.
 
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
Mitglied: colinardo
24.11.2014, aktualisiert um 14:42 Uhr
Moinsens,
hatte ich dir hier schon geschrieben wie du dies bewerkstelligst:
http://www.administrator.de/forum/powershell-dateien-suchen-ordner-unte ...
Genauer gesagt dort in der Zeile 16

Hier mit gleichzeitiger Änderung der Erweiterung zu *.pdf:
$filepath = "$zielDir\$($_.Basename).pdf"
anders für dich vielleicht verständlicher geschrieben
$filepath = $zielDir + "\" + $_.Basename + ".pdf"
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
Bitte warten ..
Mitglied: internet2107
24.11.2014 um 19:45 Uhr
Danke erstmal, Uwe.

Nur leider klappt es nicht. Es klappt nicht so, wie es sein soll.
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.
Also Beispiel: Im ersten Ordner sind 20 Dateien, also müsste er auch im Zielordner wieder 20 Dateien haben. Im zweiten sind 18 Dateien, also müssten im zweiten Zielordner auch 18 sein.
Es sind aber plötzlich im ersten Zielordner alle Dateien enthalten, also auch aus allen anderen Ordnern.

Man möge mir verzeihen, aber ich bin leider nicht so ein Hardcore Programmierer und erfahren, wie du und viele andere hier.

01.
$pfad_allgemein = "c:\quelle" 
02.
$pfad_allgemein_pdf = "d:\bearbeitet" 
03.
$pfad_allgemein_pdf_a = "d:\bearbeitet\pdfa"" 
04.
 
05.
dir -Path $pfad_allgemein -Include *.df1, *.dx1, *.ff1 -recurse | foreach { 
06.
$zielDir = $_.DirectoryName.Replace($pfad_allgemein, $pfad_allgemein_pdf) 
07.
$zielDir_pdfa = $_.DirectoryName.Replace($pfad_allgemein, $pfad_allgemein_pdf_a) 
08.
Write-Host "Zielverzeichnis " $zielDir 
09.
new-item -ItemType Directory -Path $zielDir -Force 
10.
new-item -ItemType Directory -Path $zielDir_pdfa -Force 
11.
		 
12.
13.
 
14.
$DATDateien = gci -Path $pfad_allgemein -Include *.df1, *.dx1, *.ff1 -recurse 
15.
ForEach ($used_dat in $DATDateien) 
16.
17.
			$objword = New-Object -ComObject word.application 
18.
			$objword.visible = $false 
19.
			$filepath = Join-Path -Path $zielDir -ChildPath ($used_dat.name + ".pdf") 
20.
			$doc = $objword.documents.Open($used_dat.FullName) 
21.
			 
22.
			$objword.selection.pagesetup.topmargin = 30 
23.
			$objword.selection.pagesetup.leftmargin = 20 
24.
			$objword.selection.pagesetup.rightmargin = 10 
25.
			$objword.selection.pagesetup.bottommargin = 30 
26.
			$selection = $objword.Selection 
27.
			$selection.Font.Name = $schriftart 
28.
			$selection.Font.Size = $schriftart_groesse_allgmein 
29.
			$printout_pagesize = "wdPaper$seite_groesse" 
30.
			$selection.PageSetup.PaperSize = [Microsoft.Office.Interop.Word.WdPaperSize]::$printout_pagesize 
31.
			$selection.PageSetup.Orientation = $printout_page_set 
32.
					 
33.
			$doc.SaveAs([ref]$filepath, [ref]17) #17 steht für PDF 
34.
			$doc.Saved = $true 
35.
			 
36.
			$doc.Close() 
37.
			$objword.Quit() 
38.
			[System.Runtime.Interopservices.Marshal]::ReleaseComObject($objword) 
39.
			 
40.
41.
 
42.
...... 
43.
hier geht er dann zum zweiten Schritt, zur Umwandlung pdfa.... 
44.
		
Bitte warten ..
Mitglied: colinardo
24.11.2014, aktualisiert um 21:54 Uhr
hier ging es ja erst einmal nur um eine Grundsatzfrage deinerseits nämlich deine Zeile mit den Fragezeichen ...mehr hatte ich mir nicht angesehen.
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 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 ...
01.
$pfad_allgemein = "c:\quelle" 
02.
$pfad_allgemein_pdf = "d:\bearbeitet" 
03.
$pfad_allgemein_pdf_a = "d:\bearbeitet\pdfa" 
04.
 
05.
$DATDateien = gci -Path $pfad_allgemein -Include *.df1, *.dx1, *.ff1 -recurse 
06.
 
07.
$objword = New-Object -ComObject word.application 
08.
$objword.visible = $false 
09.
$objword.DisplayAlerts = $false 
10.
 
11.
foreach($used_dat in $DATDateien){ 
12.
 
13.
        $zielDir = $used_dat.DirectoryName.Replace($pfad_allgemein, $pfad_allgemein_pdf) 
14.
        Write-Host "Zielverzeichnis "$zielDir 
15.
        If(!(Test-Path $zielDir)){new-item -ItemType Directory -Path $zielDir -Force} 
16.
 
17.
	$filepath = Join-Path -Path $zielDir -ChildPath ($used_dat.name + ".pdf") 
18.
	$doc = $objword.documents.Open($used_dat.FullName) 
19.
			 
20.
	$objword.selection.pagesetup.topmargin = 30 
21.
	$objword.selection.pagesetup.leftmargin = 20 
22.
	$objword.selection.pagesetup.rightmargin = 10 
23.
	$objword.selection.pagesetup.bottommargin = 30 
24.
	$selection = $objword.Selection 
25.
	$selection.Font.Name = $schriftart 
26.
	$selection.Font.Size = $schriftart_groesse_allgmein 
27.
	$printout_pagesize = "wdPaper$seite_groesse" 
28.
	$selection.PageSetup.PaperSize = [Microsoft.Office.Interop.Word.WdPaperSize]::$printout_pagesize 
29.
	$selection.PageSetup.Orientation = $printout_page_set 
30.
					 
31.
	$doc.SaveAs([ref]$filepath, [ref]17) #17 steht für PDF 
32.
	$doc.Saved = $true 
33.
	$doc.Close() 
34.
35.
 
36.
$objword.DisplayAlerts = $true 
37.
$objword.Quit() 
38.
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($objword)
Viel Erfolg
Bitte warten ..
Mitglied: internet2107
25.11.2014 um 07:56 Uhr
Guten Morgen und DANKE, Uwe.
OK. Soweit hast du meinen Tag schon mal gerettet, denn im ersten Schritt läuft es nun so wie es soll.

Aber, es wäre ja schön, wenn ich nicht gerade am zweiten Schritt verzweifel und ich verstehe nicht wieso und warum es nicht geht.

Im Schritt (Code) oben erstellt er ja aus den Dateien nun richtig PDFs, erstellt die Ordner und legt die PDF auch in der Ordnerstruktur ab.
Im zweiten Schritt aber soll er aus den PDFs, PDFa umwandeln.

Im Grunde genommen ist es dasselbe wie oben, nur halt eine andere Arbeitsfolge. Statt Word->PDF, nun PDF->PDFa

Ich habe also nur einen leicht geänderten Code, aber er macht einen Fehler. Obwohl er ja aus dem Ordner (wo im ersten Schritt die generierten PDF liegen), sucht und bearbeitet, speichert er aber auch die geänderteten PDFa nun im selben Ordner.
Und ich finde zum Teufel komm raus den Fehler nicht.. es ist ggrrrrrrr.

01.
###### Ab hier Konvertierung von pdf nach pdf/a 
02.
 
03.
$oPDFCreator = New-Object -ComObject "PDFCreator.clsPDFCreator" 
04.
$oPDFCreatorfiles = gci -Path $pfad_allgemein_pdf -Include *.pdf -Recurse 
05.
	 
06.
foreach ($pdf_a in $oPDFCreatorfiles) 
07.
08.
$zielDirpdfa = $pdf_a.DirectoryName.Replace($pfad_allgemein_pdf, $pfad_allgemein_pdf_a) 
09.
 
10.
If (!(Test-Path $zielDirpdfa)) { new-item -ItemType Directory -Path $zielDirpdfa -Force } 
11.
		 
12.
		$filename_pdfa = Join-Path -Path $zielDirpdfa -ChildPath ($pdf_a.name + ".pdf") 
13.
		 
14.
$filename = $pdf_a.FullName 
15.
 
16.
Start-Sleep -m 10000 # 10 Sekunden 
17.
 
18.
if (Test-Path $pdftool_x86) 
19.
20.
Start-Process $pdftool_x86 ('/IF"' + $filename + '" /OF"' + $filename_pdfa + '" /NoStart /OutputSubFormat"PDF/A-1b"') 
21.
22.
else 
23.
24.
Start-Process $pdftool_x64 ('/IF"' + $filename + '" /OF"' + $filename_pdfa + '" /NoStart /OutputSubFormat"PDF/A-1b"') 
25.
26.
([System.Runtime.InteropServices.Marshal]::ReleaseComObject($oPDFCreator) -gt 0) 
27.
		 
28.
29.
 
Bitte warten ..
Mitglied: colinardo
25.11.2014 um 10:23 Uhr
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 !
Bitte warten ..
Mitglied: internet2107
25.11.2014 um 10:52 Uhr
Zitat von colinardo:

wäre schön wenn du mal die Fehlermeldungen posten würdest, sonst muss ich mir hier immer den Hals verbiegen

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.


Tja.. das ist ja das Problem . Es kommt keine Fehlermeldung, sonst würde ich sie gerne posten.
Wie gesagt, macht er ja all das, was er soll. Praktisch. Theoretisch aber alles im Startordner.
Und eben das verstehe ich nicht.

Zu deiner Frage:
Hinter: $pdftool_x86 steht = 'C:\Program Files\PDFCreator\PDFCreator.exe'

Also:
Mit diesem Befehl sage ich ihm ja, lies alle PDFs in diesem Ordner mache damit etwas.

01.
$oPDFCreatorfiles = gci -Path $pfad_allgemein_pdf -Include *.pdf -Recurse 
Und dann sage ich ihm ja, ändere das Zielverzeichnis (noch mal) und lege (noch mal) dieselbe Ordnerstruktur im zweiten Zielordner an, also hierbei PDFa.
!!! Aber genau das macht er nicht !!!
Er legt die Ordner noch mal, weil ( -force ), im zweiten Quellordner an und schreibt die PDFa ebenso in den Quellordner, so dass ich nun im Ordner PDF auch die PDFa-Files habe.
Also:
name_der_datei.dx1.pdf (weil in Schritt 1 über Word zu PDF generiert)
name_der_datei.dx1.pdf.pdf (weil in Schritt 2 von PDF zu PDFa generiert)

01.
foreach ($pdf_a in $oPDFCreatorfiles) 
02.
03.
$zielDirpdfa = $pdf_a.DirectoryName.Replace($pfad_allgemein_pdf, $pfad_allgemein_pdf_a) 
04.
 
05.
If (!(Test-Path $zielDirpdfa)) { new-item -ItemType Directory -Path $zielDirpdfa -Force } 
06.
		 
07.
		$filename_pdfa = Join-Path -Path $zielDirpdfa -ChildPath ($pdf_a.name + ".pdf") 
08.
 
Was ich nicht verstehe: Wir geben ihm einen Quellordner ($pfad_allgemein_pdf) und sagen ihm den weiteren Zielordner ($pfad_allgemein_pdf_a), was ja mit dem Befehl in der Schleife oben zu sehen ist.
$zielDirpdfa = $pdf_a.DirectoryName.Replace($pfad_allgemein_pdf, $pfad_allgemein_pdf_a)
Aber ????????
Bitte warten ..
Mitglied: colinardo
25.11.2014, aktualisiert um 11:26 Uhr
Mach es doch wie oben bereits geschrieben alles in einer einzigen Schleife zusammen:
Also ungetestet (da kein PDF Creator vorhanden) etwa so.
01.
$pfad_allgemein = "c:\quelle" 
02.
$pfad_allgemein_pdf = "d:\bearbeitet" 
03.
$pfad_allgemein_pdf_a = "d:\bearbeitet\pdfa" 
04.
 
05.
$pdftool_x86 = "$($env:ProgramFiles)\PDFCreator\PDFCreator.exe" 
06.
$pdftool_x64 = "$(${env:ProgramFiles(x86)})\PDFCreator\PDFCreator.exe" 
07.
 
08.
$DATDateien = gci -Path $pfad_allgemein -Include *.df1, *.dx1, *.ff1 -recurse 
09.
 
10.
$oPDFCreator = New-Object -ComObject "PDFCreator.clsPDFCreator" 
11.
$objword = New-Object -ComObject word.application 
12.
$objword.visible = $false 
13.
$objword.DisplayAlerts = $false 
14.
 
15.
foreach($used_dat in $DATDateien){ 
16.
     
17.
    # Pfade setzen ------ 
18.
    $zielDir = $used_dat.DirectoryName.Replace($pfad_allgemein, $pfad_allgemein_pdf) 
19.
    $zielDir_pdf_a = $used_dat.DirectoryName.Replace($pfad_allgemein,$pfad_allgemein_pdf_a) 
20.
 
21.
    If(!(Test-Path $zielDir)){new-item -ItemType Directory -Path $zielDir -Force} 
22.
    If(!(Test-Path $zielDir_pdf_a)){new-item -ItemType Directory -Path $zielDir_pdf_a -Force} 
23.
 
24.
	$filepath_pdf = Join-Path -Path $zielDir -ChildPath ($used_dat.name + ".pdf") 
25.
	$filepath_pdf_a = Join-Path -Path $zielDir_pdf_a -ChildPath ($used_dat.name + ".pdf") 
26.
    # --------------------- 
27.
 
28.
    # Word-Umwandlung ------------- 
29.
	$doc = $objword.documents.Open($used_dat.FullName) 
30.
	$objword.selection.pagesetup.topmargin = 30 
31.
	$objword.selection.pagesetup.leftmargin = 20 
32.
	$objword.selection.pagesetup.rightmargin = 10 
33.
	$objword.selection.pagesetup.bottommargin = 30 
34.
	$selection = $objword.Selection 
35.
	$selection.Font.Name = $schriftart 
36.
	$selection.Font.Size = $schriftart_groesse_allgmein 
37.
	$printout_pagesize = "wdPaper$seite_groesse" 
38.
	$selection.PageSetup.PaperSize = [Microsoft.Office.Interop.Word.WdPaperSize]::$printout_pagesize 
39.
	$selection.PageSetup.Orientation = $printout_page_set 
40.
	$doc.SaveAs([ref]$filepath_pdf, [ref]17) #17 steht für PDF 
41.
	$doc.Saved = $true 
42.
	$doc.Close() 
43.
    # ---------------------------- 
44.
     
45.
    # PDFa umwandlung ------------ 
46.
 
47.
    if (Test-Path $pdftool_x86){ 
48.
        Start-Process $pdftool_x86 ('/IF"' + $filepath_pdf + '" /OF"' + $filepath_pdf_a + '" /NoStart /OutputSubFormat"PDF/A-1b"') 
49.
    }else{ 
50.
        Start-Process $pdftool_x64 ('/IF"' + $filepath_pdf + '" /OF"' + $filepath_pdf_a + '" /NoStart /OutputSubFormat"PDF/A-1b"') 
51.
52.
    # ----------------------------- 
53.
54.
 
55.
$objword.DisplayAlerts = $true 
56.
$objword.Quit() 
57.
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($objword) 
58.
[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
Bitte warten ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

(8)

Tipp von agowa338 zum Thema Windows 10 ...

Ähnliche Inhalte
Microsoft Office
Excel Dateien durchsuchen und Werte einzeln in neue Excel Datei auslesen (1)

Frage von krischanii zum Thema Microsoft Office ...

Windows Tools
gelöst Tool um neue Dateien aus Ordner A EINMAL in Ordner B zu kopieren (6)

Frage von Archimedes zum Thema Windows Tools ...

Batch & Shell
gelöst Dateien anhand des Namens in neue Ordner verschieben (17)

Frage von Cookiemonster zum Thema Batch & Shell ...

Windows Userverwaltung
Dateien mit Admin-Login lesen und kopieren (3)

Frage von istike2 zum Thema Windows Userverwaltung ...

Heiß diskutierte Inhalte
Microsoft
Ordner mit LW-Buchstaben versehen und benennen (20)

Frage von Xaero1982 zum Thema Microsoft ...

Outlook & Mail
gelöst Outlook 2010 findet ost datei nicht (19)

Frage von Floh21 zum Thema Outlook & Mail ...

Netzwerkmanagement
gelöst Anregungen, kleiner Betrieb, IT-Umgebung (18)

Frage von Unwichtig zum Thema Netzwerkmanagement ...

Festplatten, SSD, Raid
M.2 SSD wird nicht erkannt (14)

Frage von uridium69 zum Thema Festplatten, SSD, Raid ...