Powershellscript als Print-Hotfolder
Hallo Zusammen,
ich benötige ein script das alle 5 Sekunden überprüft ob neue Dateien in einem bestimmten Ordner liegen und wenn ja, sollen diese an den lokalen Standarddrucker geschickt werden.
Nach dem drucken sollen die Dateien/die Datei in einen Ordner verschoben werden. Die log muss nicht unbedingt geschrieben werden, ist aber nice to have.
Das drucken funktioniert schon sehr gut mit:
Das überwachen des Ordners habe ich schonmal in Python3 gecoded und so ähnlich sollte es mit PS auch gehen:
Ich dachte an das cmdlet FileSystemWatcher und habe hierzu auch schon etwas gefunden:
https://gallery.technet.microsoft.com/scriptcenter/Powershell-FileSystem ...
Daraufhin hab ich das nachfolgende script zusammengepuzzelt:
Wenn ich das Script ausführe gibt er kurz im Terminal aus, dass eine Datei erstellt wurde aber dann endet das Script sofort. Weiter passiert nichts.
ich benötige ein script das alle 5 Sekunden überprüft ob neue Dateien in einem bestimmten Ordner liegen und wenn ja, sollen diese an den lokalen Standarddrucker geschickt werden.
Nach dem drucken sollen die Dateien/die Datei in einen Ordner verschoben werden. Die log muss nicht unbedingt geschrieben werden, ist aber nice to have.
Das drucken funktioniert schon sehr gut mit:
$files = Get-ChildItem "C:\Users\R&D\Documents\printfolder\*.pdf"
foreach ($file in $files){
start-process -FilePath $file.fullName -Verb Print
Move-Item -FilePath $file.fullName C:\Users\R&D\Documents\printed -Verbose -Force *>&1
Das überwachen des Ordners habe ich schonmal in Python3 gecoded und so ähnlich sollte es mit PS auch gehen:
import shutil
import os
import time
while True:
source_dir = os.path.expanduser('~/Documents/Ordner1')
dest_dir = os.path.expanduser('~/Documents/Ordner2')
if os.listdir(source_dir): #Wenn Dateien im Ordner liegen ist die if-Abfrage wahr und der nachfolgende Code wird ausgeführt. Ansonsten wird nach ein paar Sekunden erneut geprüft.
time.sleep(15)
for file in os.listdir(source_dir):
fullpath = os.path.join(source_dir, file)
#Code der auszuführen ist wenn Dateien im Ordner sind.
else:
time.sleep(3)
time.sleep(3)
Ich dachte an das cmdlet FileSystemWatcher und habe hierzu auch schon etwas gefunden:
https://gallery.technet.microsoft.com/scriptcenter/Powershell-FileSystem ...
Daraufhin hab ich das nachfolgende script zusammengepuzzelt:
$folder = 'C:\Users\R&D\Documents\Python_Powershell_print\printfolder' # Enter the root path you want to monitor.
$filter = '*.*' # You can enter a wildcard filter here.
# In the following line, you can change 'IncludeSubdirectories to $true if required.
$fsw = New-Object IO.FileSystemWatcher $folder, $filter -Property @{IncludeSubdirectories = $false;NotifyFilter = [IO.NotifyFilters]'FileName, LastWrite'}
Register-ObjectEvent $fsw Created -SourceIdentifier FileCreated -Action {
$name = $Event.SourceEventArgs.Name
$changeType = $Event.SourceEventArgs.ChangeType
$timeStamp = $Event.TimeGenerated
$files = Get-ChildItem "C:\Users\R&D\Documents\Python_Powershell_print\printfolder\*.pdf"
Write-Host "The file '$name' was $changeType at $timeStamp" -fore green
Out-File -FilePath C:\printed\outlog.txt -Append -InputObject "The file '$name' was $changeType at $timeStamp"
foreach ($file in $files){
start-process -FilePath $file.fullName -Verb Print
Move-Item -FilePath $file.fullName C:\printed -Verbose -Force *>&1
}
}
# To stop the monitoring, run the following commands:
# Unregister-Event FileDeleted
# Unregister-Event FileCreated
# Unregister-Event FileChanged
Wenn ich das Script ausführe gibt er kurz im Terminal aus, dass eine Datei erstellt wurde aber dann endet das Script sofort. Weiter passiert nichts.
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 474722
Url: https://administrator.de/forum/powershellscript-als-print-hotfolder-474722.html
Ausgedruckt am: 22.04.2025 um 07:04 Uhr
3 Kommentare
Neuester Kommentar
Moin,
du hast das Prinzip noch nicht ganz verstanden. Das Event wird für jede einzelne Datei, der erstellt wird ausgelöst. Das Get-Childitem und das foreach kannst du dir also sparen.
Und ja, das Script macht den Anschein, als wenn es beendet wird - was faktisch auch stimm. Die Events bleiben aber erhalten - arbeiten also weiter.
Gruß
du hast das Prinzip noch nicht ganz verstanden. Das Event wird für jede einzelne Datei, der erstellt wird ausgelöst. Das Get-Childitem und das foreach kannst du dir also sparen.
Und ja, das Script macht den Anschein, als wenn es beendet wird - was faktisch auch stimm. Die Events bleiben aber erhalten - arbeiten also weiter.
Gruß

Du verwendest Variablen und Eigenschaften die es überhaupt nicht gibt $name.Fullname gibt es nicht!! Die Entsprechende Variable die den ganzen Pfad enthält ist im Event die $Event.SourceEventArgs.FullPath:
Bei Bedarf muss hier zwischen dem Print und dem Verschieben je nach Dateityp eine Pause gesetzt werden, oder man sammelt die Files in einem Array und verschiebt gesammelt zu einem späteren Zeitpunkt.
Die Events bestehen so lange wie die entsprechende Powershell-Session existiert, wird die Session geschlossen sind die Events auch gelöscht.
Bei Bedarf muss hier zwischen dem Print und dem Verschieben je nach Dateityp eine Pause gesetzt werden, oder man sammelt die Files in einem Array und verschiebt gesammelt zu einem späteren Zeitpunkt.
Die Events bestehen so lange wie die entsprechende Powershell-Session existiert, wird die Session geschlossen sind die Events auch gelöscht.
$folder = 'C:\Users\R&D\Documents\Python_Powershell_print\printfolder' # Enter the root path you want to monitor.
$filter = '*.*' # You can enter a wildcard filter here.
# In the following line, you can change 'IncludeSubdirectories to $true if required.
$fsw = New-Object IO.FileSystemWatcher $folder, $filter -Property @{IncludeSubdirectories = $false;NotifyFilter = [IO.NotifyFilters]'FileName, LastWrite'}
Unregister-Event -SourceIdentifier FileCreated -EA 0
Register-ObjectEvent $fsw Created -SourceIdentifier FileCreated -Action {
$name = $Event.SourceEventArgs.Name
$fullname = $Event.SourceEventArgs.FullPath
$changeType = $Event.SourceEventArgs.ChangeType
$timeStamp = $Event.TimeGenerated
Write-Host "The file '$fullname' was $changeType at $timeStamp" -fore green
Out-File -FilePath "C:\Users\R&D\Documents\Python_Powershell_print\outlog.txt" -Append -InputObject "The file '$fullname' was $changeType at $timeStamp"
start-process -FilePath $fullname -Verb Print -Wait
Move-Item $fullname -Destination "C:\printed" -Verbose -Force
$MyEmail = "mymail@gmail.com"
$SMTP= "smtp.gmail.com"
$To = "mymail@gmail.com"
$Subject = "PRINT HOTFOLDER HIT"
$Body = "PRINT HOTFOLDER HIT"
$Creds = (Get-Credential -Credential "$MyEmail")
Send-MailMessage -To $to -From $MyEmail -Subject $Subject -Body $Body -SmtpServer $SMTP -Credential $Creds -UseSsl -Port 587 -DeliveryNotificationOption never
}
cls
write-host "Waiting for new files ..." -F Green
while($true){
sleep 1
}