我有一个正在打印的旧应用程序,我无法在应用程序中禁用此功能。此任务打印到 Windows 定义的打印机队列。我遇到的问题是,如果没有连接真正的打印机,打印队列最终会变满,然后正在打印的作业会停止,等待队列响应作业已被接受。
旧版应用程序正在通过 Powershell 脚本进行打印。
if( sm_control_flag )
{
get-content $TO_PRINTER | Out-Printer -name $cfgs.PRINTER_QUEUE
}
问题是这些脚本无法更改,因为它们是在分布式位置进行生产的。有许多脚本可以执行此类过程。
Out-Printer 需要返回成功,而不是错误,否则脚本将因打印错误而中止。因此,队列必须存在(基本上是 Windows Server OS 中定义的打印机)。
如果没有定义并附加到队列中的实际打印机,Windows 将接受该作业并将输出排队进行打印。问题是队列最终将填满服务器上的可用空间,然后阻止所有打印。当队列已满时,Powershell 脚本的 Out-Printer 也会暂停并等待释放队列空间。
我无法禁用计算机上的打印功能并删除作业,因为其他打印机已连接并需要打印。我需要的是一个只接受打印作业但不执行任何操作的打印机驱动程序。我不需要它进行打印,只需要删除它。
我还尝试简单地打印到文件,这样每次我都可以重复使用相同的文件名,这将覆盖上次的打印输出,并满足我的需求。问题是打印到文件似乎总是提示用户输入文件名。这是一台 Windows 服务器,没有用户真正提示输入文件名,因此这会阻塞队列并暂停脚本。
是否有人知道如何接受作业然后简单地删除输出而不打印作业?
答案1
打开Control Panel
并选择Devices and Printers
。
窗口打开后Device and Printers
,选择Add Printer
。接下来的操作取决于您的网络和 Windows 版本,但您可能需要选择The printer I want isn't listed.
此时,您应该看到一个带有单选按钮的窗口Add a local printer or network printer with manual settings
。选择该选项,然后单击Next
。
从这里,您可以从下拉列表中Use an existing port:
进行选择。nul: (Local Port)
再次单击Next
,现在您可以选择所需的任何打印机驱动程序,为打印机命名,然后完成设置。
您刚刚创建的打印机将成为系统上的黑洞。它将使用您选择的驱动程序处理打印作业,包括从打印队列中清除作业,但输出将无处可去。
答案2
strPort="<printer port name"
strNameSpace= "root\cimv2"
#the sql/wql query can be changed to go on other values.
#prepare to connect to a remote computer
Set oLocator = CreateObject("WbemScripting.SWbemLocator")
#connect to a remote computer
#strUser local or domain admin username
#strPassword password for above
Set oService = oLocator.ConnectServer(strServer, strNameSpace, strUser, strPassword)
#Set administrator privileges
oService.Security_.impersonationlevel = 3
oService.Security_.Privileges.AddAsString "SeLoadDriverPrivilege"
#Query the internal representation of the printer
Set oPrinter=oService.ExecQuery("SELECT * FROM Win32_Printer where DeviceID like'"&strPort&"%'")
#alternative query option
#Set oPrinter=oService.ExecQuery("SELECT * FROM Win32_Printer where Name like'"&strPort&"%'")
#If you give the strPort and exact name only 1 printer will match
#It can match multiple printers if two printer have similiar names
# printer: me-1 and me-2 with both be matched by strPort="me"
For Each Printer In oPrinter
#pause the printer
uResult = Printer.Pause()
#cancel all jobs
uResult = Printer.CancelAllJobs()
#if any error occures uResult will not be 0
if uResult <>0 then wscript.echo "Error occured"
Next
如果您在具有打印队列的计算机上运行脚本,则可能不需要凭据。
另存为 vbs 文件 cscript whatever.vbs