Jump to content

Fosco

Junior Member
  • Content Count

    123
  • Joined

  • Last visited

Community Reputation

10 Neutral

About Fosco

  • Rank
    Junior Member
  • Birthday 09/06/1970
  1. Hallo Leute, erst einmal ein frohes und besinnliches Fest und nochmal ein Danke für euer Hilfe. Ich habe in der letzten Woche noch mal die Zeit gefunden, das Script zu testen. (Wer zum Teufel klaut eigentlich immer die Zeit vor Weihnachten?????) Das Ergebniss..... Ich habe die Funktion als separate Datei in dem Verzeichnis abgelegt und in dem Script über ". .\Start-ProcessWithTimeout.ps1" am Anfang eingefügt. In dieser Variante hat es einwandfrei funktioniert!!! Warum es nicht funktioniert hat, als ich es in die Profildatei eingefügt hatte, kann ich einfach nicht nachvollziehen. Bei einer weiteren Verzeichnis hatte es dann erstmal wieder nicht funktioniert. Allerdings habe ich da rausgefunden, das die Fehlermeldung von "pdfinfo.exe" differierte. Diese habe ich dann als potenzielle "Result"-Ergebniss zugefügt und schon funktioniert es wieder... Also danke und ein frohes Fest.... Fosco
  2. So, hab mir das noch einmal durchgelesen. Also ich hab PowerShell_ISE genutzt. Durch den Eintrag in die Profil-Datei sollte die Funktion doch jetzt allgemein zur Verfügung stehen. Oder verstehe ich das falsch? Aber ich werde es mal versuchen, in dem ich die Funktion in eine separate Datei packe und als dot-sourcing in das Script einbinden. Mal sehen ob das etwas ändert...
  3. Nabend... Sry, aber ich bin erst heute Abend dazu gekommen, das Script auszuprobieren. Die Funktion habe ich in die Datei "Microsoft.PowerShellISE_profile.ps1" kopiert und das Script so angepasst. Zumindest so wie es, denke ich, sein sollte. $ToolPath = 'C:\Users\Alex\Desktop\Tools\pdftest\pdfinfo.exe' $DefectFilesPath = 'N:\CutFolders' Get-ChildItem -Path 'N:\rec\Verloren\Dokumente\pdf' -Filter *.pdf | ForEach-Object{ $PDFFilePath = $PSItem.FullName # hier wird der komplette Pfad zur PDF-Datei innerhalb der switch-Anweisung nutzbar gemacht $Result = Start-ProcessWithTimeout -FilePath $ToolPath -ArgumentList $PSItem.FullName # -Timeout 20 # anpassen falls nötig If($Result.State -eq 'Completed' -and $Result.HasMoreData){ switch ($Result.Result) { {$Result.Result -match 'Usage:\s+pdfinfo'} { "PDF-Tool SyntaxError - $PDFFilePath"; break } {$Result.Result -match 'find\s+trailer\s+dictionary'} { Move-Item -Path $PDFFilePath -Destination $DefectFilesPath; break } {$Result.Result -match 'PDF\s+version:'} { "PDF file is valid - $PDFFilePath"; break } } } Else{ "PDF-Tool stuck ... - $PDFFilePath" } } Wenn ich es jetzt ausführe, dann bekomme ich aber eine Fehlermeldung: Start-ProcessWithTimeout : The term 'Start-ProcessWithTimeout' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or if a path was included, verify that the path is correct and try again. At N:\rec\Verloren\Dokumente\pdftester4.ps1:8 char:19 + $Result = Start-ProcessWithTimeout -FilePath $ToolPath -Argum ... + ~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : ObjectNotFound: (Start-ProcessWithTimeout:String) [], CommandNotFoundException + FullyQualifiedErrorId : CommandNotFoundException PDF-Tool stuck ... - N:\rec\Verloren\Dokumente\pdf\1068125040.pdf Fehlt evtl. hinter "$ToolPath -ArgumentList" was fehlt? Oder habe ich etwas falsch ergänzt?
  4. Vielen Dank für deine Mühen... Den unteren Teil habe ich verstanden (denke ich) und mal so angepasst, wie ich es mir (als Laie) denke. Problem ist, das auch eine zu öffnende Datei als defekt erkannt werden kann. Daher habe ich den String von "PDF file is damaged" in (Could´t) "find Trailer Dictionary" abgeändert. Damit sollten nur noch wirklich defekte Dateien verschoben werden. $ToolPath = '<kompletter Pfad zum PDFInfo-Tool>\bin64\pdfinfo.exe' $DefectFilesPath = 'Zielordner' Get-ChildItem -Path <Pfad zu den zu verarbeitenden PDF-Dateien> -Filter *.pdf | ForEach-Object{ $PDFFilePath = $PSItem.FullName # hier wird der komplette Pfad zur PDF-Datei innerhalb der switch-Anweisung nutzbar gemacht $Result = Start-ProcessWithTimeout -FilePath $ToolPath -ArgumentList $PSItem.FullName # -Timeout 20 # anpassen falls nötig If($Result.State -eq 'Completed' -and $Result.HasMoreData){ switch ($Result.Result) { {$Result.Result -match 'Usage:\s+pdfinfo'} { "PDF-Tool SyntaxError - $PDFFilePath"; break } {$Result.Result -match 'find\s+trailer\s+dictionary'} { Move-Item -Path $PDFFilePath -Destination $DefectFilesPath; break } {$Result.Result -match 'PDF\s+version:'} { "PDF file is valid - $PDFFilePath"; break } } } Else{ "PDF-Tool stuck ... - $PDFFilePath" } } Unsicher bin ich mit dem $PDFFilePath im switch-block. Da es sich um eine Datei handelt würde ich gefühlsmäßig eher zu $PSItem.Fullname tendieren. Aber da kann ich natürlich auch "heavy on the woodway" sein... Ich habe es auch so verstanden, das die Funktion die du erstellt hast innerhalb der ForEach-Schleife gestartet wird (Start-ProcesswithTimeout). Was mir noch unklar ist, wie gehe ich mit der Funktion um? Wo und/oder Wie wird sie hinterlegt? Muss die irgendwo eingefügt werden? Danke Fosco
  5. Danke für eure Antworten.... Aber ich geb zu, jetzt bin ich komplett raus und kann euch nicht mehr folgen...
  6. Danke für den Tip. Ich bin jetzt bei diesem Stand: foreach ($FileItem in $FoundPdfList) { $i++ Write-Progress -Activity 'Prüfe gefundene PDF-Dateien' -Status "$i von $($FoundPdfList.Count)" -CurrentOperation $FileItem.Name [string]$FilePath = $FileItem.FullName $retValue = & $PdfInfoToolPath $FilePath 2>&1 $retValueProcess = ??? if ($retValue | Select-String -Pattern 'find trailer dictionary') { Move-Item -Path $FilePath -Destination $DefectFilesPath wait-process -name pdfinfo -timeout 5 -ErrorAction SilentlyContinue if ($retValueProcess | Select-String -Pattern 'ProcessNotTerminated') { stop-process -name pdfinfo -force -ErrorAction SilentlyContinue } } } Was mir noch nicht klar ist, wäre die Übernahme des Fehlercodes von wait-process in die Variable "$retValueProcess". Hier wird ja auf eine Rückmeldung eines Standartbefehls Bezug genommen. Im Gegensatz dazu wird bei "$retValue" die Variable aus einem Vorgegeben Pfad und einen ausgelesenen Pfad zusammen gesetzt. Auch wenn ich zugeben muss, das mir da auch die Syntax nicht klar ist... Danke für die Hilfe...
  7. Hi Leute, ich habe ein bisschen weiter versucht eine Lösung zu finden, Dabei bin ich auf folgende Variante gestoßen: foreach ($FileItem in $FoundPdfList) { $i++ Write-Progress -Activity 'Prüfe gefundene PDF-Dateien' -Status "$i von $($FoundPdfList.Count)" -CurrentOperation $FileItem.Name [string]$FilePath = $FileItem.FullName $retValue = & $PdfInfoToolPath $FilePath 2>&1 if ($retValue | Select-String -Pattern 'find trailer dictionary') { Move-Item -Path $FilePath -Destination $DefectFilesPath wait-process -name pdfinfo -timeout 5 stop-process -name pdfinfo -force } } Mit Outlook getestet, habe ich folgende Meldungen erhalten: 1. Outlook nicht beendet Wait-Process : Dieser Befehl hat den Vorgang beendet, da der Prozess "OUTLOOK (11624)" nicht innerhalb des angegebenen Timeouts beendet wurde. In C:\Users\alexander.thissen\Desktop\tools\test.ps1:1 Zeichen:1 + Wait-Process -Name OUTLOOK -Timeout 5 + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : CloseError: (System.Diagnostics.Process (OUTLOOK):Process) [Wait-Process], TimeoutException + FullyQualifiedErrorId : ProcessNotTerminated,Microsoft.PowerShell.Commands.WaitProcessCommand Stop-process hat Outlook dann auch einfach beendet. 2. Outlook in der Zeitspanne beendet Stop-Process : Es kann kein Prozess mit dem Namen "OUTLOOK" gefunden werden. Überprüfen Sie den Prozessnamen, und rufen Sie das Cmdlet erneut auf. In C:\Users\alexander.thissen\Desktop\tools\test.ps1:2 Zeichen:1 + Stop-Process -Name OUTLOOK -Force + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : ObjectNotFound: (OUTLOOK:String) [Stop-Process], ProcessCommandException + FullyQualifiedErrorId : NoProcessFoundForGivenName,Microsoft.PowerShell.Commands.StopProcessCommand Keine Meldung von wait-process, aber stop-process meldet, das der Prozess nicht gefunden wurde, Mein Gedanken gehen dahin, das die Funktion "stop-process", ähnlich wie das verschieben der Dateien, nur ausgeführt wird, wenn "wait-process" die ErrorId "ProcessNotTerminated" ausgibt. Müsste dann, denke ich, eine If-Schleife innerhalb der If-Schleife zum umkopieren sein. Was meint Ihr? Könnte das so funktionieren, und wenn ja, wie setzt man das um (evtl. auch so, das die Meldungen zu wait und stop nicht dargestellt werden)? Nochmals Danke.....
  8. Leider so alle 5-8 Dateien. D.h. ich muss ständig dabei sitzen...
  9. Ich muss noch einmal was fragen, bzw. um Hilfe bitten. Das Script läuft wunderbar. Leider klemmt pdfinfo manchmal, und schmiert ab. An und für sich kein Problem, leider will es dann in einer Massagebox einen Buttonklick (Programm schließen), um weiter zu machen. Kann man soetwas auch ergänzend automatisieren? Nochmals Danke....
  10. Ich könnt ausflippen, es klappt.... Ich habe etwas über 100 Dateien prüfen lassen, und es wurde nur 30 Dateien aussortiert. Alle habe ich per Hand geöffnet, und alle sind defekt. Die Änderung auf "Couldn't find trailer dictionary", umgeht das problem mit der "xref" . Das wird mir reichlich Zeit sparen, wenn ich die defekten Dateien gleich aussortieren kann. Ich kann dir gar nicht genug danken....
  11. Mea Culpa... Du hast recht, ich habe es nur über das lesen versucht zu verstehen. Und das hat wohl nicht gefunzt,,,,, Ich hoffe es gilt wenigstens, das ich es versucht habe..... Ich habe aber mal rumprobiert und glaube das "problem" erkannt zu haben. Bei der Datei, die ich nicht öffnen kann erhalte ich diese Meldung: N:\CutFolders>pdfinfo 10019120.pdf Syntax Error: Couldn't read xref table Syntax Warning: PDF file is damaged - attempting to reconstruct xref table... Syntax Error: Couldn't find trailer dictionary Syntax Error: Couldn't read xref table Diese Datei wird definitiv defekt erkannt. Bei eine Datei, die als Defekt aussortiert wurde gab diese Meldung: N:\CutFolders>pdfinfo 1000729376.pdf Syntax Error: Couldn't read xref table Syntax Warning: PDF file is damaged - attempting to reconstruct xref table... Title: Microsoft Word - WHFB_Chronicles_4_maket.doc Author: Administrator Creator: Pscript.dll Version 5.0 Producer: Acrobat Distiller 5.0 (Windows) CreationDate: Tue Dec 30 15:58:23 2003 ModDate: Tue Dec 30 15:58:23 2003 Tagged: no Form: none Pages: 44 Encrypted: no Page size: 595 x 842 pts (A4) (rotated 0 degrees) File size: 37588992 bytes Optimized: no PDF version: 1.3 Beim Schließen "will" die Datei gespeichert werden. Das habe ich mal gemacht, und diese Datei nochmal getestet. Ergebnis: N:\CutFolders>pdfinfo 1000729376.pdf Title: Microsoft Word - WHFB_Chronicles_4_maket.doc Author: Administrator Creator: Pscript.dll Version 5.0 Producer: Acrobat Distiller 5.0 (Windows) CreationDate: Tue Dec 30 12:58:23 2003 ModDate: Thu Nov 14 15:42:56 2019 Tagged: no Form: none Pages: 44 Encrypted: no Page size: 595 x 842 pts (A4) (rotated 0 degrees) File size: 37578898 bytes Optimized: yes PDF version: 1.6 Scheinbar kann eine PDF-Datei auch defekt geöffnet werden, wenn es den/die/das "xref table" betrifft. Kann man sowas ausklammern?
  12. Hi MurdocX, bin leider nicht sofort zum testen gekommen. Habs aber nun erledigt. Leider mit negativem Ergebniss. Es werden noch immer alle Dateien umkopiert. Schlag mich nicht, wenn ich darauf rumreite aber ich versteh es nicht. Das Programm"pdfinfo" gibt, so wie ich es verstehe, als Exitcode 0,1,2 oder 99 aus. Warum prüfst du auf "-String - Pattern Error" ab? Allerdings hast du auch schon ne Menge Zeit reingesteckt. Ich möchte nicht unverschämt sein und dir noch mehr Zeit kosten. Daher wäre es vielleicht an der Zeit, hier einen Break zu machen. Ich werden dann wohl doch alles per Hand prüfen. Jedenfalls danke ich dir sehr für die Mühe, die du dir gemacht hast.....
  13. Hmm... Also ich glaube, wir sind einen Schritt weiter... Die Dateien werden jetzt umkopiert. Leider werden aber alle Dateien umkopiert, und nicht nur diejenigen die defekt sind. Ich versuche ja zumindest das Script zu verstehen, deshalb frage ich jetzt mal ganz dumm... Wird hier wirklich der nummerische Fehlercode abgeprüft? Mich irritiert das "Select-String -Pattern Error", das für mich aussieht, als wenn nach dem Wort "Error" geprüft werden sollte. Sry, falls es eine dämliche Fragen sein sollte....
  14. Hallo MurdocX, ich habe das Script getestet. Es läuft sauber durch, aber verschiebt leider keine defekten Dateien. In dem Text-File zu pdfinfo.exe habe ich gefunden, das ein nummerischer Exit-Code zurück gegeben wird. Wenn ich dein Script richtig verstehe, fragt es keinen nummerischen Code ab, sondern erwartet das "Wort" Error"? Könnte es daran liegen? Und wenn ja, kann man das entsprechend abändern (ich denke, das es der Wert 1 sein müsste...)? Nochmals Danke und Gruß Fosco
  15. Hallo MurdocX, vielen Dank für deine Hilfe. Ich komme leider heute nicht mehr dazu, das Script zu testen, werde es aber so schnell wie möglich nachholen. Dann werde ich mich mit dem Ergebnis melden. Und auch vielen Dank für die weitere Überarbeitung. Fosco
×
×
  • Create New...