Erledigt veraltete Druckjobs per Script löschen

SkAvEnGeR

Themenstarter
Master of Tools
Hi Leute,

ich habe hier ein paar Etiketten-Drucker als Netzwerkdrucker.

Manchmal stauen sich die Druckjobs, wenn die User munter drucken obwohl die Papierrolle leer ist.

Ich möchte jetzt im spooler-Ordner prüfen,
ob Job-Daten vorhanden sind,
ihr Alter prüfen,
mit der aktuellen Zeit vergleichen und
wenn sie älter als 5 Minuten sind,
diese alten Jobs löschen.

Wie kann ich sowas per script realisieren?
 

rick_s

Bekanntes Mitglied
Kein Skript und nicht 100%, was du beschreibst. Aber vielleicht mal ausprobieren.


(Sordum hat jede Menge kleine freie und portable Tools)
 

Dorwyn

Bekanntes Mitglied
Schon mal sorry fürs Shreddern, aber ich habe den ultimativen Tipp:
Papierrolle einlegen! It's magic! :D


Hab ich hier in der Firma auch einige portable Zebra Labeldrucker im Einsatz. Da darf ich bspw. nicht einfach die Druckjobs abbrechen weil die mit am ERP hängen. Die Verpackungen müssen gelabelt werden, aber der Druckjob darf nicht erneut über den Barcodescanner ausgelöst werden da ansonsten das ERP durcheinander kommt... ich weiß, ist mies, wir arbeiten dran :)
 

Kipish

Bekanntes Mitglied
Ich lösche alte Job bisher so, das mit der Zeit müsste man noch reinfummeln:

@echo off
echo.
echo Druckerwarteschlange stoppen...
net stop Spooler
echo Druckauftraege loeschen...
ping localhost -n 4 > nul
del /q %SystemRoot%\system32\spool\printers\*.*
net start Spooler
echo erledigt!
ping localhost -n 4 > nul
 

SkAvEnGeR

Themenstarter
Master of Tools
@rick_s : Danke, aber das Tool erfüllt leider nicht meine Anforderungen

@Dorwyn : Bei uns geht es auch um Zebras. Diese sind mit einem RFID-Scanner verbunden und die MA halten ihren Chip dran, damit sie 60 Labels mit ihrer MA-Nummer erhalten. Dem ERP ist die Anzahl der gedruckten Labels egal.
Problem ist aktuell, dass der Lieferant nicht so schnell wie ursprünglich vereinbart neue Etiketten liefern kann und manchmal hängen zig Jobs in der Warteschlange und wenn der Drucker dann wieder drucken kann haut er erstmal zig Labels raus, die dann aber schon veraltet sind und nicht mehr genutzt werden können.

Nächstes Problem: Ich kann nicht einfach alle Jobs löschen, weil auch das Kühlhaus mit am gleichen Spooler hängt (war so nötig für das ERP - wir hätten das auch lieber getrennt)

@Kipish : Danke, den Ansatz habe ich auch bereits - aber genau die Selektion nach Dateialter ist hier extrem wichtig.

@all:
wie kann ich per Batch-Schleife das Datum von mehreren Dateien auslesen?
wie kann ich den Zeitstempel einer Datei mit der aktuellen Zeit vergleichen?

Wenn ich diese beiden Dinge lösen und später vereinen kann, sollte sich mein Problem lösen lassen.
 

SkAvEnGeR

Themenstarter
Master of Tools
Danke an Alle

mit BATCH lässt sich - in unserem speziellen Fall - das Problem nicht lösen, weil dazu immer der SPOOLER-Dienst beendet werden muss

Eine Lösung mit AutoIT konnte ich auch realisieren - löscht jedoch sofort alle Jobs
PowerShell war die Lösung
Letztendlich greifen fast alle Script-Lösungen auf WmiObjekte zurück

Mein aufgehübschtes und erweitertes PowerShell-Script sieht nun so aus:
Markdown (GitHub flavored):
# Holt sich die korrekte Urzeit
$CurrentTime = Get-Date
# Zeit-Differenz für die Anzeige - nur zum prüfen
$myTime1 = (Get-Date).addminutes(-2)
# Zeit-Differenz zum löschen
$myTime2 = (Get-Date).addminutes(-3)
# Holt den realen PCNamen aus der Umgebung
$PCname = $env:computername
# Pfad und Name der LOG-Datei
$logFile = ".\delete-old-printJobs.log"

# Prüft die Jobs auf ihr Alter und gibt eine Anziege der betreffenden Jobs aus
# für den effektiven Ablauf des Scripts nicht erforderlich
# kann später gelöscht werden
Get-Printer -ComputerName $PCname | Foreach-Object {
    $Printer = $_
    $Printer | Get-Printjob |
        Where-Object {$_.SubmittedTime -lt $myTime1 } |
        Select-Object @{name="Name";expression={$_.printerName}},
        @{name="Submitted Time";expression={$_.SubmittedTime}},
        @{name="Job-ID";expression={$_.ID}},
        @{n='Time Difference';e={[math]::Truncate(($CurrentTime - $_.SubmittedTime).TotalMinutes)}} |
        Sort-Object -Property jobstatus -Descending
}


# Hole alle Druck-Jobs
$printJobs = Get-WmiObject Win32_PrintJob

ForEach ($printJob in $printJobs) {
  # konvertiere WMI time zu ordentlicher .NET DateTime
  $jobTime = [System.Management.ManagementDateTimeConverter]::ToDateTime($printJob.TimeSubmitted)
 
  # Wenn "TimeSubmitted" des Jobs älter ist als myTime2 - lösche des Job
  if ($jobTime -lt $myTime2) {
    $outputString = "Deleting job {0} by user {1} submitted on {2}" -f $printJob.JobId,$printJob.owner,$jobTime
    Write-Verbose $outputString
    ECHO $outputString
    # schreibe die Erfolgsmeldung in eine LOG-Datei
    Out-File -FilePath $logFile -InputObject $outputString -Encoding UTF8 -Width 70 -Append
    $printJob.Delete()
  }
}

Quelle: https://gist.github.com/dstreefkerk/780160fc3de4543d832d654436046be0

Edit: Quell-Script hinzugefügt
 
Zuletzt bearbeitet:

PedroAltenw

Neues Mitglied
Ich weiß nicht, ob das Problem gelöst werden könnte oder nicht. Wenn nicht, lesen Sie diese nützliche Anleitung und befolgen Sie zuerst diese gängigen Methoden:

Starten Sie den Pinter Spooler neu
Führen Sie die Fehlerbehebung für den Drucker aus

Wenn diese Lösungen nicht funktionieren, wenden Sie diese Lösung an, um den Druckertreiber zu aktualisieren und neu zu installieren. Hoffe, das hilft, das Problem zu beheben.
 

SkAvEnGeR

Themenstarter
Master of Tools
Vielen Dank für den Hinweis.

Ein Neustart des PrintSpoolers geht aber aus diversen Gründen nicht. siehe Beitrag #5

Daher eine andere Lösung gesucht und gefunden. - Das PowerShell-Script aus Beitrag #8 funktioniert hier wunderbar.

PS: Hinweis @PedroAltenw : das Thema ist bereits als "Erledigt" markiert.
 
Oben Unten