isarc01
Goto Top

Powershell Script wird nicht komplett ausgeführt!

Hallo

folgendes Problem:

Ich habe eine Anwendung, welches das Script ausführt, aber nur Teil1!
Wenn ich das Script allerdings manuell starte, funktioniert es komplett (Teil1 und Teil2)
Wenn ich es über einen Taskplaner ausführe, funktioniert es auch komplett!
(Allerdings kann ich es hier nur alle 1 Minute starten, was zu lange dauert, dass ist mein Problem)

Das Script wird wie gesagt auch von der Anwendung ausgeführt, aber nur der erste Teil1.
Ich verstehe es nicht wirklich...

#Teil1
foreach($item in (Get-ChildItem -Recurse -Path "C:\Scans\Urkunden\" | Where-Object {$_.Name -like "*GBATrue*.pdf*"}))  
{
    Move-Item -Path $item.FullName -Destination "C:\Scans\GBA\$(get-date -f yyyyMMddThhmmssZ" ")$($item.Name)"  
}

Start-Sleep -s 5
foreach($item in (Get-ChildItem -Recurse -Path "C:\Scans\Urkunden\" | Where-Object {$_.Name -like "*HRTrue*.pdf*"}))  
{
    Move-Item -Path $item.FullName -Destination "C:\Scans\HR\$(get-date -f yyyyMMddThhmmssZ" ")$($item.Name)"  
}
Start-Sleep -s 5

#Teil2
# Print Job
$printer = 'optimidoc'  
gci "C:\Scans\Urkunden\1print\*.pdf" | %{  
    # starte PDF-Druck via Shell-Verb 'printto' 
    $pdfApp = (start-process $_ -Verb "printto" -PassThru -ArgumentList "$printer").ProcessName  
    # initialer sleep
    sleep(3)
    # loope solange bis Datei freigegeben wurde und lösche sie dann
    while($true){del $_ -Force -EV err -EA SilentlyContinue; If($err){sleep(1)}else{break}}
}

# PDF Applikation beenden
get-process $pdfApp -ErrorAction SilentlyContinue | Stop-Process

Content-Key: 554559

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

Printed on: April 24, 2024 at 23:04 o'clock

Member: SlainteMhath
SlainteMhath Mar 05, 2020 at 13:08:57 (UTC)
Goto Top
Moin,

Ah, was für ein herrliches copy&paste script... *würg*

Das kann ca. 1235 Gründe haben... Evtl. schreibt "die Anwendung" ein Logfile? Oder es steht was im Eventlog? Rechte usw passen? Anwendung läuft im richtigen Userkontext? Drucker vorhanden? PS Fehlermeldung kommt keine?

Evtl. hilfts auch, wenn du ein bischen Errorhandling in das Script einbaust....

lg,
Slainte
Member: Kraemer
Kraemer Mar 05, 2020 at 14:34:19 (UTC)
Goto Top
Moin,.

Zitat von @isarc01:
Start-Sleep -s 5
...
Start-Sleep -s 5
wozu sollen die gut sein?

# initialer sleep
sleep(3)
noch so'n Ding - hier aber mit Ansage ^^

# loope solange bis Datei freigegeben wurde und lösche sie dann
while($true){del $_ -Force -EV err -EA SilentlyContinue; If($err){sleep(1)}else{break}}
was soll sowas? Unsauberer und Fehleranfälliger geht ja schon nicht mehr
Siehe: https://www.colorconsole.de/PS_Windows/de/Wait-Process.htm

Gruß
Mitglied: 143127
143127 Mar 05, 2020 updated at 15:31:17 (UTC)
Goto Top
Zitat von @Kraemer:
was soll sowas? Unsauberer und Fehleranfälliger geht ja schon nicht mehr
Siehe: https://www.colorconsole.de/PS_Windows/de/Wait-Process.htm
Tja probier das doch erst mal selbst beim Adobe Reader oder Acrobat aus, da wartest du dann nämlich bist du schwarz bist, der schließt sich nämlich nicht nachdem er gedruckt hat sondern lässt den Prozess minimiert in der Taskleiste hängen, da bringt dir ein Wait-Process nichts! In dem Fall ist das also schon sinnvoll weil es nicht anders geht ohne sehr viel mehr Aufwand zu treiben. Das sind Workarounds für den Adobe-Bullshit, der sich eben nicht so verhält wie er eigentlich sollte.
Ich würde gerne deine "funktionsfähige" Lösung für den Acrobat sehen wenn du eine bessere dafür hast. Du musst ja irgendwie das Druckende des PDFs ermitteln. Man kann natürlich mit [IO.File]::OpenWrite() und einem Try-Catch prüfen ob die Datei wieder beschreibbar ist und so die Freigabe ermitteln, aber im Endeffekt macht das obige das selbe nur halt über Remove-Item und Fehlerhandling.

Ich selbst verwende mittlerweile eine eigene DLL zum PDF-Drucken.

An den TO:
(Allerdings kann ich es hier nur alle 1 Minute starten, was zu lange dauert, dass ist mein Problem)
Ich würde hier stattdessen gleich zu einem FileSystemWatcher greifen der arbeitet die Files direkt ab wenn sie im Ordner abgelegt werden! So ist ein wiederholtes Aufrufen des selben Skriptes überflüssig und spart Ressourcen.
Member: Kraemer
Kraemer Mar 05, 2020 updated at 16:21:47 (UTC)
Goto Top
Zitat von @143127:
Tja probier das doch erst mal selbst beim Adobe Reader oder Acrobat aus, da wartest du dann nämlich bist du schwarz bist, der schließt sich nämlich nicht nachdem er gedruckt hat sondern lässt den Prozess minimiert in der Taskleiste hängen, da bringt dir ein Wait-Process nichts!
Leider richtig. Ich bin allerdings davon ausgegangen, dass nicht der Adobe-Reader benutzt wird, weil das Script angeblich als geplanter Task fehlerfrei funktioniert. Auch @colinardo schreibt in dem Thread, aus dem der Code "geklaut" wurde, dass der AgroReader dafür nicht taugt..

In dem Fall ist das also schon sinnvoll weil es nicht anders geht ohne sehr viel mehr Aufwand zu treiben. Das sind Workarounds für den Adobe-Bullshit, der sich eben nicht so verhält wie er eigentlich sollte.
für nen Script was ab und an mal läuft sicherlich. Eine Lösung ist sowas aber nicht.

Ich würde gerne deine "funktionsfähige" Lösung für den Acrobat sehen wenn du eine bessere dafür hast. Du musst ja irgendwie das Druckende des PDFs ermitteln. Man kann natürlich mit [IO.File]::OpenWrite() und einem Try-Catch prüfen ob die Datei wieder beschreibbar ist und so die Freigabe ermitteln, aber im Endeffekt macht das obige das selbe nur halt über Remove-Item und Fehlerhandling.
Die Try-Catch-Methode würde ich bevorzugen

Ich selbst verwende mittlerweile eine eigene DLL zum PDF-Drucken.
Ich brauche das nicht all zu häufig. Aktuell noch im Einsatz eine Lösung mit Foxit und eine mit Cups