chrissssi
Goto Top

Powershell PDF Drucken über Scheduler Task

Hallo zusammen,

ich bin hier gerade am verzweifeln...

Ich habe in Powershell Skript, welchen mir eine PDF drucken soll. Diesen Powershell skript wird aus einer .bat Datei aufgerufen.
Wenn ich das manuell aufrufe dann funktioniert es wunderbar, wenn ich einen Scheduler Task draus mache dann wird das Skript auch aufgerufen, aber es wird nicht gedruckt.

Wenn ich die Prozesse vom Server beobachte, dann wird der Adobe Reader Prozess auch ganz kurz gestartet, beendet sich aber auch gleich wieder. Aber ich habe in meinem Skript ein sleep 30 eingebaut bevor der Prozess wieder beendet wird.

Vielen Vielen Dank für eure Hilfe.

Hier das Skript
Param(
    [String] $printInfos
)
 $printInfos = "124*Laser*C:\Druckjob\test.pdf*TestDrucker#"  
#"123456789*REC*C:\Druckjob\test.pdf*testDrucker#123456789*VSL*C:\Druckjob\zm400output200dpi.prn*testDrucker2#123456789*VSL*C:\Druckjob\zm400output200dpi.prn*testDrucker2"; 
[String] $delimiter1 = "#";  
[String] $delimiter2 = "*";  

#Erstmal die einzelnen Dateien aus dem Übergabe String splitten
#Durch den .Splitt wird automatisch ein Array erzeugt
$splittString = $printInfos.Split($delimiter1);

#Über dieses Array kann ich dann loopen
for($i=0; $i -lt $splittString.Length; $i++){
    
    #Splitte nochmal die einzelnen Properties für einen Dateidruck auf
    $splittDateiProbs = $splittString[$i].Split($delimiter2);
   
    #Dole mir aus dem Array splittDateiProbs die wichtigsten sachen raus 
    $dateityp = $splittDateiProbs[1]
    $dateiZumDrucken = $splittDateiProbs[2];
    $druckerName = $splittDateiProbs[3];

    #Je nach Dateityp den eigenen Druckvorgang auslösen 
    switch($Dateityp){
        
         #Rechnungen sind im Format PDF und werden auf dem Laser Drucker gedruckt
         #Hier geht der Weg über den AdobeReader.
         #Mit Start-Process wird das Dokument mit dem Adobe Reader geöffnet und mit printto an den Drucker übergeben
         #Das Problem ist das sich dadurch der Adobe Reader nicht mehr schliesst. Deshalb muss er manuell geschlossen werden nachjedem druck
         "Laser" {   
         
                #Hier wird der Prozess gestartet und sich die app gemerkt mit der der Druck gestartet wurde
                $pdfApp = (start-job $DateiZumDrucken -Verb "printto" -PassThru -ArgumentList $druckerName).ProcessName  
                #Um den Prozess zu beenden muss sich die ID des Druck prozessen gemerkt werden um diesen später zu killen
                $prozess = Get-Process $pdfApp

                #Dann eine Zeit warten bis gedruckt wird, den Wert kann man beliebig ändern
                sleep 30

                #Zu guter letzt den Prozess beenden
                get-process -id $prozess.id -ErrorAction SilentlyContinue | Stop-Process
        
               }
         "VSL" {   
                #Wenn ein Etikett gedruckt werden muss wird die Datei 1zu1 an den Drucker geschickt
                #Weil es sich hierbei um ein Binär dokument handelt und es keine Dateizuordung gibt die der start-Prozess braucht
                #Was hier aber das gute ist, der Etiketten drucker weis gleich was er mit der Datei anfangen muss
                #Allerdings braucht der Copy eine Freigabe auf dem Rechner und die wird dann angesteuert
                $druckerFreigabe = "\\"+$env:computername+"\"+$druckerName;   
                copy $DateiZumDrucken  $druckerFreigabe; 
              }
    }

}

Content-Key: 299483

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

Ausgedruckt am: 28.03.2024 um 15:03 Uhr

Mitglied: 114757
114757 18.03.2016 aktualisiert um 14:55:16 Uhr
Goto Top
Moin,
ich denke das es mal wieder eins der typischen Probleme ist. Drucker wurde nur für den aktuellen User gemappt und durch Ausführen des Tasks mit anderem Account deshalb im geplanten Task nicht verfügbar. Zusätzlich sollte man Bedenken das Netzlaufwerke ebenfalls nur in der jeweiligen Usersession verfügbar sind, hier sollte man also mit UNC-Pfaden arbeiten.

Das alles kannst du ganz leicht überprüfen indem du entsprechendes Logging in dein PS-Skript einbaut was die die verfügbaren Drucker und Testweise den Zugriff auf eventuell verwendete Zielshares/Datengräber auflistet.

Gruß jodel32
Mitglied: Chrissssi
Chrissssi 21.03.2016 um 09:13:08 Uhr
Goto Top
Danke Jodel32 für deine Antwort. Das ist der Grund. Die Drucker werden im log nicht aufgeführt.

Das bedeutet raus finden wie der Drucker eingerichtet werden muss damit der Sheduled Task drauf zu greifen kann.
Über eine Freigabe funktioniert es auch nicht.
Hat dazu jemand eine Idee/Vorschlag/Lösung? face-smile

Vielen Dank nochmal.
Mitglied: 114757
114757 21.03.2016 um 09:50:19 Uhr
Goto Top
Nun, ganz einfach den Drucker in dem Account mit dem der Task ausgeführt wird einmal verbinden, dann steht er auch in dieser Session zur Verfügung. Netzwerkdrucker-Mappings sind Userabhängig gemappt.
Mitglied: Chrissssi
Chrissssi 21.03.2016 um 10:38:09 Uhr
Goto Top
Das war von Anfang an schon so. Ich habe nur einen Benutzer, mit dem bin ich auf dem Server angemeldet und habe den Drucker installiert und der Scheduled Task läuft unter dem gleichen Benutzer.
Wäre auch ein Berechtigungsproblem denkbar? Der Benutzer ist lokaler Admin, dann müsste doch der Task auch als lokaler Admin laufen oder?