superspamtube
Goto Top

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:
$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.

Content-Key: 474722

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

Ausgedruckt am: 28.03.2024 um 21:03 Uhr

Mitglied: Kraemer
Kraemer 19.07.2019 um 11:33:23 Uhr
Goto Top
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ß
Mitglied: superspamtube
superspamtube 19.07.2019 um 12:21:22 Uhr
Goto Top
Danke für dein Kommentar. Hab das Script abgeändert:

$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

Write-Host "The file '$name' was $changeType at $timeStamp" -fore green   
Out-File -FilePath C:\Users\R&D\Documents\Python_Powershell_print\outlog.txt -Append -InputObject "The file '$name' was $changeType at $timeStamp"  
start-process -FilePath $name.fullName -Verb Print
Move-Item -FilePath $name.fullName C:\printed -Verbose -Force *>&1

$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")  

Start-Sleep 2

Send-MailMessage -To $to -From $MyEmail -Subject $Subject -Body $Body -SmtpServer $SMTP -Credential $Creds -UseSsl -Port 587 -DeliveryNotificationOption never

<# 
$PSEmailServer variable can be used to pre-configure the
SMTP server in your Powershell Profile. Then you don't need  
to specify -smtpserver paramter. Send-MailMessage will use the
SMTP sever address assigned to $PSEmailServer
Delivery Notification Options:
-- None: No notification.        
-- OnSuccess: Notify if the delivery is successful.      
-- OnFailure: Notify if the delivery is unsuccessful.     
-- Delay: Notify if the delivery is delayed.       
-- Never: Never notify.
#>
}
# To stop the monitoring, run the following commands: 
# Unregister-Event FileDeleted 
# Unregister-Event FileCreated 
# Unregister-Event FileChanged

Aber es funktioniert nicht. Er druckt nicht und kopiert nicht. Mail wird auch nicht geschickt und wenn ich Unregister-Event FileCreated in die Konsole eingebe bekomm ich die Rückmeldung das dieses Event nicht registriert ist.


PS C:\Users\R&D\Documents\Python_Powershell_print> Unregister-Event FileCreated
Unregister-Event : Ereignisabonnement mit der ID "FileCreated" ist nicht vorhanden.
In Zeile:1 Zeichen:1

back-to-topUnregister-Event FileCreated

back-to-top~~~~~~~~~~~~~~~~~~~~~~~~~~~~

+ CategoryInfo : InvalidArgument: (face-smile [Unregister-Event], ArgumentException
+ FullyQualifiedErrorId : INVALID_SOURCE_IDENTIFIER,Microsoft.PowerShell.Commands.UnregisterEventCommand
Mitglied: 140447
140447 19.07.2019 aktualisiert um 16:09:12 Uhr
Goto Top
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.
$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
}