Benutzer mit den meisten Antworten
Word Dokument öffnen, Inhalt lesen

Frage
-
Hallo werte Gemeinde,
ich habe folgendes Ziel:
Ich möchte Word-Dokumente öffnen und nach bestimmten Inhalten durchsuchen. Dabei geht es zum Beispiel darum, ein Datum an einer bestimmten Stelle auszulesen.
Mein Problem beginnt aber schon damit, daß ich die Word-Dokumente gar nicht geöffnet bekomme. Ich gehe folgenden Weg:In einer Domänenumgebung passiert nun folgendes:$Word = New-Object -comobject Word.Application $Dokument = $Word.Documents.Open("D:\Test.doc")
Es öffnet sich eine Abfrage, das Dokument wäre schon geöffnet, ob ich es schreibgeschützt öffnen möchte. Die Datei ist aber noch gar nicht geöffnet und die Abfrage blockiert jedes weitere Arbeiten des Skripts.
Umgebung: Windows 7 Prof, W2k8 Domäne, Office 2010
Wo liegt mein Fehler?Gruß
Antworten
-
Also, man muß da ein bisschen tricksen. Den Text kannst du hiermit in eine Variable übertragen:
$Word = New-Object -comobject Word.Application $Word.Visible = $true $Dokument = $Word.Documents.Open("D:\Test2.docx") $word.ActiveWindow.selection.WholeStory() $word.ActiveWindow.Selection.Copy() $text = [System.Windows.Forms.Clipboard]::GetText() $text [System.Windows.Forms.Clipboard]::Clear() $Word.quit()
Word wird geöffnet, der gesamte Text markiert und in die Zwischenablage kopiert. Dann lesen wir die Zwischenablage wieder aus (Powershell bietet das leider nicht, daher wird hier WinForms benutzt) und übertragen sie in $text.Am Ende wird die Zwischenablage wieder gelöscht, weil sich sonst Word nicht schliessen ließe, da die Abfrage "Sie haben viel Text in die Zwischenablage kopiert.." kommt.
Was die Kopfzeile betrifft, ist das deutlich komplizierter, siehe hier. Da müsste man sich mit beschäftigen, den Code in Powershell zu übertragen. Hab ich momentan keine Zeit zu. Wenns nicht eilt kann ichs mir die Tage vielleicht nochmal anschauen.
Grüße, Denniver
Blog: http://bytecookie.wordpress.com
Hilf mit und markiere hilfreiche Beiträge als "Hilfreich" und Beiträge die deine Frage ganz oder teilweise beantwortet haben als "Antwort".
- Als Antwort markiert xploded Donnerstag, 11. August 2011 12:38
- Bearbeitet Denniver ReiningMVP, Moderator Donnerstag, 11. August 2011 13:02 kleine Korrektur
-
Eigentlich solltest du ohne die Eigenschaft ".visible = $true" gesetzt zu haben, gar nichts sehen. Ich denke das deine Datei wirklich schon geöffnet ist, aber in einem unsichtbaren (ohne Fenster) Prozess im Hintergrund.
Öffne mal den Taskmanager und schliesse alle Word-Prozesse die du findest und dann probiers nochmal so:
$Word = New-Object -comobject Word.Application $Word.Visible = $true $Dokument = $Word.Documents.Open("D:\Test.doc")
Grüße, Denniver
Blog: http://bytecookie.wordpress.com
Hilf mit und markiere hilfreiche Beiträge als "Hilfreich" und Beiträge die deine Frage ganz oder teilweise beantwortet haben als "Antwort".- Als Antwort markiert Denniver ReiningMVP, Moderator Montag, 15. August 2011 17:10
Alle Antworten
-
Eigentlich solltest du ohne die Eigenschaft ".visible = $true" gesetzt zu haben, gar nichts sehen. Ich denke das deine Datei wirklich schon geöffnet ist, aber in einem unsichtbaren (ohne Fenster) Prozess im Hintergrund.
Öffne mal den Taskmanager und schliesse alle Word-Prozesse die du findest und dann probiers nochmal so:
$Word = New-Object -comobject Word.Application $Word.Visible = $true $Dokument = $Word.Documents.Open("D:\Test.doc")
Grüße, Denniver
Blog: http://bytecookie.wordpress.com
Hilf mit und markiere hilfreiche Beiträge als "Hilfreich" und Beiträge die deine Frage ganz oder teilweise beantwortet haben als "Antwort".- Als Antwort markiert Denniver ReiningMVP, Moderator Montag, 15. August 2011 17:10
-
Super, das hat schon mal geklappt.
Wie kann ich denn nun am dümmsten den Textinhalt des Dokuments einlesen? Im XML sind auch alle Grafiken etc drin, alles Inhalte, die ich nicht brauche. Ich brauche aber nur den reinen Textinhalt des Dokuments.
Gruß
-
Das ist nicht so einfach wie es scheint. Was genau möchtest du denn mit dem Text machen?
Grüße, Denniver
Blog: http://bytecookie.wordpress.com
Hilf mit und markiere hilfreiche Beiträge als "Hilfreich" und Beiträge die deine Frage ganz oder teilweise beantwortet haben als "Antwort". -
Also, man muß da ein bisschen tricksen. Den Text kannst du hiermit in eine Variable übertragen:
$Word = New-Object -comobject Word.Application $Word.Visible = $true $Dokument = $Word.Documents.Open("D:\Test2.docx") $word.ActiveWindow.selection.WholeStory() $word.ActiveWindow.Selection.Copy() $text = [System.Windows.Forms.Clipboard]::GetText() $text [System.Windows.Forms.Clipboard]::Clear() $Word.quit()
Word wird geöffnet, der gesamte Text markiert und in die Zwischenablage kopiert. Dann lesen wir die Zwischenablage wieder aus (Powershell bietet das leider nicht, daher wird hier WinForms benutzt) und übertragen sie in $text.Am Ende wird die Zwischenablage wieder gelöscht, weil sich sonst Word nicht schliessen ließe, da die Abfrage "Sie haben viel Text in die Zwischenablage kopiert.." kommt.
Was die Kopfzeile betrifft, ist das deutlich komplizierter, siehe hier. Da müsste man sich mit beschäftigen, den Code in Powershell zu übertragen. Hab ich momentan keine Zeit zu. Wenns nicht eilt kann ichs mir die Tage vielleicht nochmal anschauen.
Grüße, Denniver
Blog: http://bytecookie.wordpress.com
Hilf mit und markiere hilfreiche Beiträge als "Hilfreich" und Beiträge die deine Frage ganz oder teilweise beantwortet haben als "Antwort".
- Als Antwort markiert xploded Donnerstag, 11. August 2011 12:38
- Bearbeitet Denniver ReiningMVP, Moderator Donnerstag, 11. August 2011 13:02 kleine Korrektur
-
Super!
Das funktioniert genau so, wie ich mir das vorgestellt habe. Das Auffinden des gesuchten Datums war dann ein Kinderspiel.
Für alle, dies es vielleicht interessiert:$Word = New-Object -comobject Word.Application $Word.Visible = $false $inhalt = $Word.Documents.Open("D:\test.doc") $inhalt.ActiveWindow.selection.WholeStory() $inhalt.ActiveWindow.Selection.Copy() $text = [System.Windows.Forms.Clipboard]::GetText() $zeilen = [regex]::Split($text, "\n") for ($i = 0; $i -lt $zeilen.Count; $i++){ if ([string]($zeilen[$i]).Contains("Zuletzt geändert") -eq $TRUE) { write-host $zeilen[$i].substring(17,10) $i = $zeilen.Count } } [System.Windows.Forms.Clipboard]::Clear() $Word.quit()
Die Sichtbarkeit kann ruhig auf $false sitzen, es funktioniert auch unsichtbar.
Für alle, die es nicht lesen können: Der Inhalt wird zeilenweise gesplittet und dann Zeile für Zeile nach dem entsprechenden Datum durchsucht. Sobald ich das Datum gefunden habe, breche ich die weitere Suche ab.Vielen Dank für die Hilfe!
-
>Die Sichtbarkeit kann ruhig auf $false sitzen, es funktioniert auch unsichtbar.
Sicher, dann ist es aber empfehlenswert mit Get-Process zu überprüfen, ob der Word-Prozess auch korrekt geschlossen wurde.
Grüße, Denniver
Blog: http://bytecookie.wordpress.com
Hilf mit und markiere hilfreiche Beiträge als "Hilfreich" und Beiträge die deine Frage ganz oder teilweise beantwortet haben als "Antwort".