删除旧的 Windows 打印作业

删除旧的 Windows 打印作业

在我们的主 Windows 2003 打印服务器上,我们共享大约 500 台打印机。我们通常有大约 50 个卡住的打印作业。虽然这还不算什么,但它让我烦透了,我每周往往要花 30 多分钟来搜索和删除卡住的作业。

我真正想要的是一个脚本,可以删除所有打印机上超过 24 小时的所有打印作业。

因为我有 UNIX 背景,所以我觉得 Windows 脚本非常令人困惑。如果能提供任何关于如何开始这项任务的建议,我将不胜感激。任何完整的解决方案都很棒。;)

干杯,

垫。

答案1

在 Powershell 中执行此操作应该相当简单。您会发现来自 *nix 的 powershell 更符合您的喜好。但是您将使用 WMI,这确实是好事也是坏事。

一些可以完成您想要的操作的示例代码(未经测试):

$strComputer = "."

$PrintJobs = get-wmiobject -class "Win32_PrintJob" -namespace "root\CIMV2" -computername $strComputer | Where-Object { $_.StartTime -lt $($(Get-Date).addDays(-1)) }

foreach ($job in $PrintJobs) {
    Write-Host "Canceling job $($job.JobId)"
    $job.Delete
}

基本上,您只需要从 WMI 获取开始时间小于现在 - 24 小时的所有对象。

答案2

这可能是您的策略。停止后台处理程序服务,删除所有旧文件并重新启动服务。

将此脚本代码写入文本文件中,并将其命名为“DeleteOldQueuedFile.vbs”:

Dim Fso, Directory, Modified, Files
Set Fso = CreateObject("Scripting.FileSystemObject")
Set Directory = Fso.GetFolder("%systemroot%\system32\spool\printers")
Set Files = Directory.Files

For Each Modified in Files  
   If DateDiff("D", Modified.DateLastModified, Now) >= 1 Then Modified.Delete
Next

编写一个批处理文件,可以将其安排为夜间作业:

net stop spooler
DeleteOldQueuedFile.vbs
net start spooler

答案3

如果您进入 Windows 2003 资源工具包,您会发现一个专门用于执行此操作的工具,名为 Cleanspl.exe。

资源工具包:mircosoft url /downloads/details.aspx?FamilyID=9D467A69-57FF-4AE7-96EE-B18C4790CFFD&displaylang=en

或者你可以编写脚本:

echo Printers - Shutting down the print spooler
net stop "pcounter printer control"
net stop "print spooler"
echo Printers - Deleting print queues
del c:\WINDOWS\system32\spool\PRINTERS\*.* /q

net start "print spooler"
net start "pcounter printer control"
echo Printers - Print spooler Started

答案4

不确定当时接受的答案是否有效,但在 Server 2012 R2 和 2016 上它不再起作用。

该属性现在为 TimeSubmitted,如果不从 WMI Timeobject 转换,则无法将其与 DateTime 进行比较。此外,由于过载,无法像在接受的答案中那样调用 Delete 方法。因此,更新后的版本将是:

$printJobs = get-wmiobject -class "Win32_PrintJob" -namespace "root\CIMV2" | Where-Object {[System.Management.ManagementDateTimeConverter]::ToDateTime($_.TimeSubmitted) -lt (Get-Date).addDays(-1)}    
foreach ($job in $printJobs) {
    $job.Delete()
}

相关内容