2014-11-08 55 views
2

我需要衡量打印作业的时间,这意味着“之间发送打印命令”和测量打印作业时以编程

“打印作业从打印队列消失了”,所以我想通过脚本

做这些事情的时候
  1. 搜索所有PDF文件
  2. 打印文件
  3. 获得打印时间(如上)
  4. 去下一个文件,所有文件都做以上

这是迄今为止我的工作(我省略某些部分)

For Each file In objFolder.Items 
' check for the extension 
    if objFSO.GetExtensionName(file.name) = "pdf" then 
'  invoke to print 
     file.InvokeVerbEx("Print") 
'  select print jobs 
     Set Printers = objWMIService.ExecQuery _ 
    ("Select * from Win32_PrintJob") 

     For Each objPrinter in Printers  
      DateTime.Value = objPrinter.TimeSubmitted 
      TimeinQueue = DateDiff("n", actualTime, Now) 
      Wscript.Echo TimeinQueue 
     Next 
    end if 
next 

主要是我要问我如何能得到的时候打印作业从打印队列中消失。

而且我需要继续下一份工作,直到一份印刷工作结束。 有什么想法?

+0

能帮'的'\ ROOT \ CIMV2'命名空间 – JosefZ 2014-11-08 11:15:47

回答

1

我一直在寻找确切的事情,我根本取消了ansgar的脚本来获得我想要的。 它将每个pdf文件和每个打印5次(所以我可以得到一个更好的avarage),同时获得time.finally打印到一个csv文件。并且从打印队列中直到其他人等待等待。不是100%acuurate却足以让演出]对比 可能是也可能有用(请纠正我的错误如果有的话)

Dim objFSO, outFile 
const forAppending = 8 
const useDefault = -2 

'Output File name 
fileName = ".\output.csv" 

Set objFSO = CreateObject("Scripting.FileSystemObject") 
set outFile = objFSO.OpenTextFile(fileName, forAppending, true, useDefault) 

'write heading to output file 
outFile.WriteLine("Filename,1,2,3,4,5") 

'get current Folder 
strFolder = Replace(wscript.scriptfullname,wscript.scriptname,".\") 
strFolder = objFSO.getFolder(strFolder) 

'Open the Shell Folders object 
Set objShell = CreateObject("Shell.Application") 

'Create an object for the specified file's parent folder 
Set objFolder = objShell.Namespace(strFolder) 

strComputer = "." 
Set objWMIService = GetObject("winmgmts:" _ 
    & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2") 

For Each file In objFolder.Items 
    If objFSO.GetExtensionName(file.name) = "pdf" Then 
    'write in to out file 
    outFile.write(file.name) 
    outFile.writeLine "" 

    'outer loop for 5 times per each file 
    index = 0 
    do while index < 5 
     'if already doing a printing do not start a new one 
     if CheckPrintQueue() = 0 then 
     file.InvokeVerbEx "Print" 
     startTime = timer 
     waitTostart 
     'if first time on outer loop it should be empty queue 
     else 
     if index = 0 then 
      wscript.echo "queue doesnt empty" 
      finish 
     end if 
     end if 
     'wait until all jobs finished printing 
     waitToEnd 
     'count time 
     ellapsTime = timer - startTime 
     'write in to out file 
     outFile.write(",") 
     outFile.Write(ellapsTime) 
     index = index + 1 
    loop 
    End If 
Next 

outFile.Close 
'----------------function CheckPrintQueue----------------------- 
Function CheckPrintQueue() 
    Set printJobs = objWMIService.ExecQuery("SELECT * FROM Win32_PrintJob") 
    Set currentDocs = CreateObject("Scripting.Dictionary") 

    CheckPrintQueue = printJobs.Count 
End Function 
'----------------end of function----------------- 

sub waitTostart 
    Do 
    WScript.Sleep 100 
    'check print queue 
    printJobCount = CheckPrintQueue() 
    Loop until printJobCount > 0 
end sub 

sub waitToEnd 
    Do 
    WScript.Sleep 100 
    'check print queue 
    printJobCount = CheckPrintQueue() 
    Loop until printJobCount = 0 
end sub 

sub finish 
    outFile.Close 
    objFSO = nothing 
    objFolder = nothing 
    objShell = nothing 
    objWMIService = nothing 
    wscript.quit 1 
end sub 
2

没有简单的方法从脚本内部获取该信息,因为当作业从打印队列中删除时,它就消失了。你可以建立一个事件监控后台打印程序是这样的:

Set wmi = GetObject("winmgmts://./root/cimv2") 
Set wbemDateTime = CreateObject("WbemScripting.SWbemDateTime") 

qry = "SELECT * FROM __InstanceOperationEvent WITHIN 1 " & _ 
     "WHERE TargetInstance ISA 'Win32_PrintJob'" 
Set mon = wmi.ExecNotificationQuery(qry) 

Do 
    Set evt = mon.NextEvent 
    If evt.Path_.Class = "__InstanceDeletionEvent" Then 
    wbemDateTime.Value = evt.TargetInstance.TimeSubmitted 
    WScript.Echo evt.TargetInstance.Document & ": " & _ 
       DateDiff("n", wbemDateTime.GetVarDate, Now) 
    End If 
Loop 

但是,你必须运行从一个不同的脚本,因为VBScript不支持多线程(即并行运行的东西),所以事件处理程序循环会阻止其余的脚本操作。

如果你想从你的脚本中的粗略值,你可以尝试这样的事情,但不要指望排队时间非常准确:

'singleton SWbemDateTime instance for time conversions 
Set wbemDateTime = CreateObject("WbemScripting.SWbemDateTime") 

'global list to keep track of printing documents 
'MUST NOT BE MODIFIED FROM ANYWHERE EXCEPT CheckPrintQueue! 
Set printingDocs = CreateObject("Scripting.Dictionary") 

Function CheckPrintQueue 
    Set printJobs = objWMIService.ExecQuery("SELECT * FROM Win32_PrintJob") 
    Set currentDocs = CreateObject("Scripting.Dictionary") 

    'get currently printing jobs from queue 
    For Each job In printJobs 
    currentDocs.Add job.Document, job.TimeSubmitted 
    Next 

    'compare global list to current list, print the queue time for documents 
    'that are no longer queued, and remove them from the global list 
    For Each doc In printingDocs.Keys 
    If Not currentDocs.Exists(doc) Then 
     wbemDateTime.Value = printingDocs(doc) 
     WScript.Echo doc & ": " & DateDiff("n", wbemDateTime.GetVarDate, Now) 
     printingDocs.Remove doc 
    End If 
    Next 

    'add new documents to global list 
    For Each doc In currentDocs.Keys 
    If Not printingDocs.Exists(doc) Then printingDocs.Add doc, currentDocs(doc) 
    Next 

    CheckPrintQueue = printJobs.Count 
End Function 

For Each file In objFolder.Items 
    If objFSO.GetExtensionName(file.name) = "pdf" Then 
    file.InvokeVerbEx "Print" 
    CheckPrintQueue 
    End If 
Next 

'wait until all jobs finished printing 
Do While CheckPrintQueue > 0 
    WScript.Sleep 100 
Loop 
+0

谢谢Win32_PrintJob'类。但在最后一个循环中,“CheckPrintJobs”应该是“CheckPrintQueue”吗? – mhs 2014-11-11 00:16:57

+0

@ mhs确实应该。固定。 – 2014-11-11 08:17:38