在我们的主 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()
}