PDF via Powershell drucken - Reader nach druck schließen
Hallo Zusammen,
ich habe ein Powershell Skript geschrieben, dass mir Archive entpackt und die darin enthaltenen PDF-Dateien druckt.
Das klappt ganz gut, jedoch soll das Skript die Dateien nach dem Drucken wieder löschen.
Aktiviere ich die Lösch-Funktion, so klappt das ganz nicht mehr, denn das Powershell Skript geht hin und setzt den Druckbefehl ab und löscht darauf hin die Datei sofort, bevor diese ausgedruckt wurde.
Nun würd ich ja ein Wait-Process einbauen, jedoch schließt sich das Reader Programm nach dem Druck leider nicht von alleine.
Ich habe bisher den Foxit-PDF Reader und den Adobe PDF Reader ausprobiert.
Kann mir jemand von euch ein Programm nennen, dass sich nach dem Drucken automatisch schließt, sodass man es überwachen kann.
Oder kann mir jemand von euch sagen wie ich das im Skript realisieren kann?
Viele Grüße
Fr4nki
ich habe ein Powershell Skript geschrieben, dass mir Archive entpackt und die darin enthaltenen PDF-Dateien druckt.
Das klappt ganz gut, jedoch soll das Skript die Dateien nach dem Drucken wieder löschen.
Aktiviere ich die Lösch-Funktion, so klappt das ganz nicht mehr, denn das Powershell Skript geht hin und setzt den Druckbefehl ab und löscht darauf hin die Datei sofort, bevor diese ausgedruckt wurde.
Nun würd ich ja ein Wait-Process einbauen, jedoch schließt sich das Reader Programm nach dem Druck leider nicht von alleine.
Ich habe bisher den Foxit-PDF Reader und den Adobe PDF Reader ausprobiert.
Kann mir jemand von euch ein Programm nennen, dass sich nach dem Drucken automatisch schließt, sodass man es überwachen kann.
Oder kann mir jemand von euch sagen wie ich das im Skript realisieren kann?
Viele Grüße
Fr4nki
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 257659
Url: https://administrator.de/forum/pdf-via-powershell-drucken-reader-nach-druck-schliessen-257659.html
Ausgedruckt am: 22.12.2024 um 13:12 Uhr
21 Kommentare
Neuester Kommentar
Hi,
Reader-Prozess beenden?
https://www.google.de/?gws_rd=ssl#q=powershell+prozess+beenden
Grüße,
Tiberius
Reader-Prozess beenden?
https://www.google.de/?gws_rd=ssl#q=powershell+prozess+beenden
Grüße,
Tiberius
Hallo Fr4nkie,
ich mach das mit dem Adobe (Reader oder Acrobat) immer so:
oder wenn stattdessen nur das Verb print im System vorhanden ist, dann so:
habe das ganze mal in eine Function gepackt:
Diese lässt sich dann folgendermaßen verwenden:
Drucken auf Default-Printer ohne Löschen
Zur Info: Bei Bedarf den sleep Parameter in Zeile 40 anpassen, wenn die Dateien nicht gedruckt werden.
Grüße Uwe
ich mach das mit dem Adobe (Reader oder Acrobat) immer so:
# Drucker definieren
$printer = 'HP Laserjet 1320'
gci "C:\Ordner\*.pdf" | %{
# starte PDF-Druck via Shell-Verb 'printto'
$pdfApp = (start-process $_.FullName -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
$printer = 'HP Laserjet 1320'
# store original printer
$originalPrinter = gwmi Win32_Printer -Filter "Default='true'"
# Set Default Printer
[void](gwmi Win32_Printer -Filter "Name='$printer'").SetDefaultPrinter()
gci "C:\Ordner\*.pdf" | %{
$pdfApp = (start-process $_.FullName -Verb "print" -PassThru).ProcessName
sleep(3)
while($true){del $_ -Force -EV err -EA SilentlyContinue; If($err){sleep(1)}else{break}}
}
get-process $pdfApp -ErrorAction SilentlyContinue | Stop-Process
#restore original default printer
[void]$originalPrinter.SetDefaultPrinter()
habe das ganze mal in eine Function gepackt:
Funktion: Print-PDF
<#
==== @colinardo / @administrator.de ====
#>
function Print-PDF {
param(
[parameter(mandatory=$true,ValueFromPipelineByPropertyName=$true)][Alias("Fullname")][ValidateNotNullOrEmpty()][string[]]$files,
[ValidateScript({(gwmi Win32_Printer -Filter "Name='$_'")})][string]$printer,
[switch]$DeleteAfterPrint
)
begin{
# set printer if defined in parameter
if ($printer -ne ''){
# store original printer
$originalPrinter = gwmi Win32_Printer -Filter "Default='true'"
# set default printer temporarily to defined printer
[void](gwmi Win32_Printer -Filter "Name='$printer'").SetDefaultPrinter()
}
# function to check file lock state
$CheckFileStatus = {
param([string]$filePath)
try{
$fileStream = (New-Object System.IO.FileInfo $filePath).OpenWrite()
$fileStream.Close(); $fileStream.Dispose()
# file is not locked by another process
return $true
}catch{
# file is locked
return $false
}
}
$pdfAppID = $null
}
process{
$files | %{
write-host "Printing document: '$_' ..." -ForegroundColor Green
# start printing pdf with default print-handler in the system
$pdfApp = (start-process $_.FullName -Verb "print" -PassThru).ProcessName
# sleep time / increase this parameter in case files get not printed
sleep(3)
# check file-lock-status in loop until it's free
while(!(&$CheckFileStatus $_)){sleep(1)}
# delete file if desired by user
if ($DeleteAfterPrint.IsPresent()){
write-host "Deleting document: '$_' ..." -ForegroundColor Yellow
del $_ -Force
}
}
}
end{
# kill pdf viewer process
get-process $pdfApp -EA SilentlyContinue | Stop-Process
if ($printer -ne ''){
#restore original default printer
[void]$originalPrinter.SetDefaultPrinter()
}
}
}
Beispiele
Drucken auf anderen Drucker mit anschließendem Löschen des PDFsgci "C:\Ordner\*.pdf" | print-pdf -printer "HP Laserjet 1320" -DeleteAfterPrint
gci "C:\Ordner\*.pdf" | print-pdf
Zur Info: Bei Bedarf den sleep Parameter in Zeile 40 anpassen, wenn die Dateien nicht gedruckt werden.
Grüße Uwe
Super Sache! Funktioniert mit Netzlaufwerk und -drucker.
Ich hab es mit Adobe probiert. Hier öffnet sich das Programm, druckt und schließt wieder. Kann man das noch unterdrücken oder gibt es ein besseres PDF Tool für diesen Zweck?
Wie ist der Code für *.HTM Daten? Der Internexexplorer ist schon drauf, d.h. ich könnte auf Adobe verzichten.
Ich hab es mit Adobe probiert. Hier öffnet sich das Programm, druckt und schließt wieder. Kann man das noch unterdrücken oder gibt es ein besseres PDF Tool für diesen Zweck?
Wie ist der Code für *.HTM Daten? Der Internexexplorer ist schon drauf, d.h. ich könnte auf Adobe verzichten.
Hallo Andinistrator,
-edit- Acrobat wie so viele andere Apps ignorieren hier das man sie unsichtbar öffnen möchte..., aber das Fenster ist ja eigentlich minimiert (zumindest Acrobat bei mir) so dass das ja bei einem unbeaufsichtigten System eigentlich egal ist.
Du kannst aber mal das hier probieren, das den Druckdialog mit einem Enter "fernsteuert":
/(Bei Bedarf die sleep-Zeiten an dein System anpassen)//
Grüße Uwe
Zitat von @Andinistrator1:
Ich hab es mit Adobe probiert. Hier öffnet sich das Programm, druckt und schließt wieder. Kann man das noch
unterdrücken oder gibt es ein besseres PDF Tool für diesen Zweck?
Lässt sich eventuell machen, muss ich nachher erst mal testen ...Ich hab es mit Adobe probiert. Hier öffnet sich das Programm, druckt und schließt wieder. Kann man das noch
unterdrücken oder gibt es ein besseres PDF Tool für diesen Zweck?
-edit- Acrobat wie so viele andere Apps ignorieren hier das man sie unsichtbar öffnen möchte..., aber das Fenster ist ja eigentlich minimiert (zumindest Acrobat bei mir) so dass das ja bei einem unbeaufsichtigten System eigentlich egal ist.
Wie ist der Code für *.HTM Daten? Der Internexexplorer ist schon drauf, d.h. ich könnte auf Adobe verzichten.
Der IE ist hier mal wieder speziell wegen Sicherheit & Co.Du kannst aber mal das hier probieren, das den Druckdialog mit einem Enter "fernsteuert":
/(Bei Bedarf die sleep-Zeiten an dein System anpassen)//
# Drucker auf dem gedruckt werden soll
$printer = 'HP Laserjet 1320'
# Original Drucker speichern
$originalPrinter = gwmi Win32_Printer -Filter "Default='true'"
# Set Default Printer
[void](gwmi Win32_Printer -Filter "Name='$printer'").SetDefaultPrinter()
$objShell = New-Object -Com Wscript.Shell
gci "C:\Ordner\*.html" | %{
start-process $_.Fullname -Verb "print" -PassThru
sleep(2)
$objShell.SendKeys("{ENTER}")
sleep(1)
while($true){del $_ -Force -EV err -EA SilentlyContinue; If($err){sleep(1)}else{break}}
}
# Original Standarddrucker wiederherstellen
[void]$originalPrinter.SetDefaultPrinter()
Vielen Dank, dass sieht gut aus. Sleep auf 5 und es wird automatisch gedruckt.
Gibt es noch einen fixen Parameter für
- Querformat (statt Hoch)
- ohne Kopfzeile (Seite 1 von 1 wird gedruckt)
- ohne Fußzeile (Quelle und Datum wird gedruckt)?
Beim PDF Script haben auch Netzwerkdrucker funktioniert, welche über ein Druckserver mit meinem Server verbunden sind. Das hier nun nicht mehr zu klappen. Wenn der Drucker lokal auf dem Server eingerichtet ist, aber schon.
Netzwerk-Laufwerke werden aber weiterhin ausgelesen.
Gibt es noch einen fixen Parameter für
- Querformat (statt Hoch)
- ohne Kopfzeile (Seite 1 von 1 wird gedruckt)
- ohne Fußzeile (Quelle und Datum wird gedruckt)?
Beim PDF Script haben auch Netzwerkdrucker funktioniert, welche über ein Druckserver mit meinem Server verbunden sind. Das hier nun nicht mehr zu klappen. Wenn der Drucker lokal auf dem Server eingerichtet ist, aber schon.
Netzwerk-Laufwerke werden aber weiterhin ausgelesen.
Zitat von @Andinistrator1:
Gibt es noch einen fixen Parameter für
- Querformat (statt Hoch)
- ohne Kopfzeile (Seite 1 von 1 wird gedruckt)
- ohne Fußzeile (Quelle und Datum wird gedruckt)?
Nein. Ebenfalls nur über Tastenfernsteuerung, aber das wird dann unzuverlässig.Gibt es noch einen fixen Parameter für
- Querformat (statt Hoch)
- ohne Kopfzeile (Seite 1 von 1 wird gedruckt)
- ohne Fußzeile (Quelle und Datum wird gedruckt)?
Beim PDF Script haben auch Netzwerkdrucker funktioniert, welche über ein Druckserver mit meinem Server verbunden sind. Das
hier nun nicht mehr zu klappen. Wenn der Drucker lokal auf dem Server eingerichtet ist, aber schon.
Normal ...Geht nur mit lokal eingerichteten Druckern, da dieser temporär als Standard gesetzt werden muss ...hier nun nicht mehr zu klappen. Wenn der Drucker lokal auf dem Server eingerichtet ist, aber schon.
Der IE kennt ja kein printto Verb, deshalb.
Netzwerk-Laufwerke werden aber weiterhin ausgelesen.
logisch ...
Ja also das PDF Script läuft einwandfrei, im Test hatte ich es nun doppelt laufen, d.h.
2 Ordnerpfade drucken auf
2 unterschiedliche Drucker
Hier hab ich nun auch Acrobat Reader (V2015.007.20033) probiert, hier geht das Fenster auf und zu, eine Minimierung beim Start hab ich nicht gefunden.
Manchmal verschluckt es sich aber, Datei nicht gefunden..., so als ob er schneller löscht wie er druckt. Ich hab den Sleep Wert auf 5 hochgesetzt, dann läuft es durch.
Thank you colinardo
2 Ordnerpfade drucken auf
2 unterschiedliche Drucker
Hier hab ich nun auch Acrobat Reader (V2015.007.20033) probiert, hier geht das Fenster auf und zu, eine Minimierung beim Start hab ich nicht gefunden.
Manchmal verschluckt es sich aber, Datei nicht gefunden..., so als ob er schneller löscht wie er druckt. Ich hab den Sleep Wert auf 5 hochgesetzt, dann läuft es durch.
Thank you colinardo
Hallo Uwe,
ich habe gerade deinen INteressanten Beitrag hier empfohlen bekommen.
Und dein Script ist fast genau das was ich suche/ benötige.
Nur leider bin ich jetzt nicht gerade der Pro was PoweShell etc. angeht.
Könntest du mir bei zwei dingen auf die Sprünge helfen ?
Er soll anstatt einem gezielten den Standartdrucker des ausführenden verwenden
und er soll die PDF nach dem drucken nicht löschen sondern in C:\Test\Archiv verschieben:
Was muss ich wo wie editieren.
gci "C:\Ordner\*.pdf" | %{
ich habe gerade deinen INteressanten Beitrag hier empfohlen bekommen.
Und dein Script ist fast genau das was ich suche/ benötige.
Nur leider bin ich jetzt nicht gerade der Pro was PoweShell etc. angeht.
Könntest du mir bei zwei dingen auf die Sprünge helfen ?
Er soll anstatt einem gezielten den Standartdrucker des ausführenden verwenden
und er soll die PDF nach dem drucken nicht löschen sondern in C:\Test\Archiv verschieben:
Was muss ich wo wie editieren.
- Drucker definieren
gci "C:\Ordner\*.pdf" | %{
- starte PDF-Druck via Shell-Verb 'printto'
- initialer sleep
- loope solange bis Datei freigegeben wurde und lösche sie dann
- PDF Applikation beenden
}
Vielen Dank vorab und sorry für die Anfänger Frage - aber iwie stehe ich auf dem Schlauch
Beste Grüße
Hallo @colinardo
ich bin gerade über diese wunderbare Powershell-Funktion von dir gestossen.
Nun habe ich kleines Problem, vielleicht hast du eine Idee:
wenn ich das Skript in der ISE ausführe, wird das PDF gedruckt und dann gelöscht.
Starte ich das Skript über einen geplanten Task, wird das PDF nicht gedruckt, aber gelöscht.
Execution-Policy hab ich zum Testen mal auf unrestricted gesetzt.
Grüsse
Thomas
ich bin gerade über diese wunderbare Powershell-Funktion von dir gestossen.
Nun habe ich kleines Problem, vielleicht hast du eine Idee:
wenn ich das Skript in der ISE ausführe, wird das PDF gedruckt und dann gelöscht.
Starte ich das Skript über einen geplanten Task, wird das PDF nicht gedruckt, aber gelöscht.
Execution-Policy hab ich zum Testen mal auf unrestricted gesetzt.
Grüsse
Thomas
Servus Thomas,
Welches Skript meinst du?
Welche Taskplanersettings wurden verwendet?
Der Drucker in dem Security-Kontext(Profil) des Taskplaners vorhanden sein, Drucker werden ja meist Userabhängig gemappt.
Muss ich dann erst evaluieren ob es Taskplanerfähig ist, und wenn dann liegt es an deinem Default PDF-Handler wenn die nicht ohne GUI klar kommt, oder das deine verwendete PDFApp Sicherheitstechnische Maßnahmen ergreift wenn Dokumente auf Netzlaufwerken bzw. unsicheren Quellen liegen.
Werde ich bei Zeiten nachholen/testen.
Welches Skript meinst du?
Welche Taskplanersettings wurden verwendet?
Der Drucker in dem Security-Kontext(Profil) des Taskplaners vorhanden sein, Drucker werden ja meist Userabhängig gemappt.
Muss ich dann erst evaluieren ob es Taskplanerfähig ist, und wenn dann liegt es an deinem Default PDF-Handler wenn die nicht ohne GUI klar kommt, oder das deine verwendete PDFApp Sicherheitstechnische Maßnahmen ergreift wenn Dokumente auf Netzlaufwerken bzw. unsicheren Quellen liegen.
Werde ich bei Zeiten nachholen/testen.
Hallo
ich meine dieses Skript:
Taskplaner (so ausm Kopf, bin schon aus dem Büro geflüchtet )
- mit höchsten Privilegien, unabhängig angemeldeter User
- Täglich alle 5 Minuten
- powershell.exe c:\Hotfolder\skript\pdfdrucken.ps1
Der Drucker ist ein Netzwerkdrucker, wurde aber lokal auf diesem Rechner installiert (kein Mapping via Printserver).
Default PDF Handler ist wohl Adobe Reader DC.
ich meine dieses Skript:
<#
==== @colinardo / @administrator.de ====
#>
function Print-PDF {
param(
[parameter(mandatory=$true,ValueFromPipelineByPropertyName=$true)][Alias("Fullname")][ValidateNotNullOrEmpty()][string[]]$files,
[ValidateScript({(gwmi Win32_Printer -Filter "Name='$_'")})][string]$printer,
[switch]$DeleteAfterPrint
)
begin{
# set printer if defined in parameter
if ($printer -ne ''){
# store original printer
$originalPrinter = gwmi Win32_Printer -Filter "Default='true'"
# set default printer temporarily to defined printer
[void](gwmi Win32_Printer -Filter "Name='$printer'").SetDefaultPrinter()
}
# function to check file lock state
$CheckFileStatus = {
param([string]$filePath)
try{
$fileStream = (New-Object System.IO.FileInfo $filePath).OpenWrite()
$fileStream.Close(); $fileStream.Dispose()
# file is not locked by another process
return $true
}catch{
# file is locked
return $false
}
}
$pdfAppID = $null
}
process{
$files | %{
write-host "Printing document: '$_' ..." -ForegroundColor Green
# start printing pdf with default print-handler in the system
$pdfApp = (start-process $_ -Verb "print" -PassThru).ProcessName
# sleep time / increase this parameter in case files get not printed
sleep(3)
# check file-lock-status in loop until it's free
while(!(&$CheckFileStatus $_)){sleep(1)}
# delete file if desired by user
if ($DeleteAfterPrint.IsPresent()){
write-host "Deleting document: '$_' ..." -ForegroundColor Yellow
del $_ -Force
}
}
}
end{
# kill pdf viewer process
get-process $pdfApp -EA SilentlyContinue | Stop-Process
if ($printer -ne ''){
#restore original default printer
[void]$originalPrinter.SetDefaultPrinter()
}
}
}
gci "C:\Hotfolder\files\*.pdf" | print-pdf -printer "Testdrucker" -DeleteAfterPrint
Taskplaner (so ausm Kopf, bin schon aus dem Büro geflüchtet )
- mit höchsten Privilegien, unabhängig angemeldeter User
- Täglich alle 5 Minuten
- powershell.exe c:\Hotfolder\skript\pdfdrucken.ps1
Der Drucker ist ein Netzwerkdrucker, wurde aber lokal auf diesem Rechner installiert (kein Mapping via Printserver).
Default PDF Handler ist wohl Adobe Reader DC.
Fazit: "Adobe Reader DC" ist nicht für den Betrieb über den Task-Scheduler geeignet da es für den Prozess eine GUI benötigt, bzw. sich beim Aufruf über die Shell ohne Console-Session selbst beendet.
Nimm für den Druck ein Tool wie Sumatra pdf reader der unterstützt auch das Batch Commandline Printing.
https://www.sumatrapdfreader.org/docs/Command-line-arguments-0c53a79e913 ...
Nimm für den Druck ein Tool wie Sumatra pdf reader der unterstützt auch das Batch Commandline Printing.
https://www.sumatrapdfreader.org/docs/Command-line-arguments-0c53a79e913 ...
-print-to-default : Prints all files indicated on this command line to the system default printer. After printing, SumatraPDF exits immediately (check the error code for failure).
-print-to <printer-name> : Prints all files indicated on this command line to the named printer. After printing, SumatraPDF exits immediately (check the error code for failure). E.g. -print-to "Microsoft XPS Document Writer" prints all indicated files to the XPS virtual printer.
@colinardo
sorry, ich steh total auf dem Schlauch.
Wie integriere ich den SumatraPDF so in dein Skript, dass die PDF's mit diesem abgearbeitet werden?
sorry, ich steh total auf dem Schlauch.
Wie integriere ich den SumatraPDF so in dein Skript, dass die PDF's mit diesem abgearbeitet werden?
Zitat von @thaefliger:
@colinardo
sorry, ich steh total auf dem Schlauch.
Wie integriere ich den SumatraPDF so in dein Skript, dass die PDF's mit diesem abgearbeitet werden?
Das Skript brauchst du doch nicht mehr . Du musst einfach nur alle zu druckenden Dokumente an das Programm übergeben, ob du das nun via Batch oder Powershell FOR-Schleife machst ist Jacke wie Hose:@colinardo
sorry, ich steh total auf dem Schlauch.
Wie integriere ich den SumatraPDF so in dein Skript, dass die PDF's mit diesem abgearbeitet werden?
Also so
gci "D:\Ordner\*.pdf" | %{ &'C:\Pfad\sumatrapdf.exe' -print-to "DeinDruckerName" "`"$($_.Fullname)`""}
&'C:\Pfad\sumatrapdf.exe' -print-to "DeinDruckerName" "`"$((gci 'D:\Ordner\*.pdf' | select -Expand Fullname) -join '" "')`""
for %%a in ("D:\Ordner\*.pdf") do "C:\Pfad\sumatrapdf.exe" -print-to "DeinDruckerName" "%%a"
Sorry, noch eine letzte Frage:
im Original-Skript gabs für das "Druck-Kommando" noch den Paramter -DeleteAfterPrint
Wie kann ich diesen Parameter hier integrieren?
hab ein paar Sachen ausprobiert, leider ohne Erfolg.
im Original-Skript gabs für das "Druck-Kommando" noch den Paramter -DeleteAfterPrint
gci "C:\Hotfolder\files\*.pdf" | print-pdf -printer "Testdrucker" -DeleteAfterPrint
Wie kann ich diesen Parameter hier integrieren?
gci "D:\Ordner\*.pdf" | %{ &'C:\Pfad\sumatrapdf.exe' -print-to "DeinDruckerName" "`"$($_.Fullname)`""}
hab ein paar Sachen ausprobiert, leider ohne Erfolg.
Zitat von @thaefliger:
Wie kann ich diesen Parameter hier integrieren?
So z.B.Wie kann ich diesen Parameter hier integrieren?
gci "D:\Ordner\*.pdf" | %{ &'C:\Pfad\sumatrapdf.exe' -print-to "DeinDruckerName" "`"$($_.Fullname)`""}
$files = gci "D:\Ordner\*.pdf"
$files | %{&'C:\Pfad\sumatrapdf.exe' -print-to "DeinDruckerName" "`"$($_.Fullname)`""}
$files | remove-item -Force