2017-05-22 50 views
0

我想使用Python清除或刪除打印作業。 但是我怎樣才能得到JobID如何在win32print中使用SetJob?

win32print.SetJob(hPrinter, JobID , Level , JobInfo , Command)

我怎麼能運行該代碼?

jobs = [] 
for p in win32print.EnumPrinters(win32print.PRINTER_ENUM_LOCAL,None, 1): 
    flags, desc, name, comment = p 

    pHandle = win32print.OpenPrinter(name) 
    print = list(win32print.EnumJobs(pHandle, 0, -1, 1)) 
    jobs.extend(print) 
    SetJob(pHandle, id, 1,JOB_CONTROL_DELETE) 
    #where should i get id from? 
    win32print.ClosePrinter(pHandle) 
+0

您是否瞭解有關打印機的一些詳細信息(例如,打印機名稱)?導致它無法遍歷所有安裝的打印機並嘗試執行此操作。你也正在給'print'分配一個內建函數的值。 – CristiFati

回答

0

從您的代碼開始,我已經成功地創建一個小的腳本,刪除任何(本地)打印機的打印作業(我測試過它,它工作)。

這是(我已經Py35運行它):

import win32print 

if __name__ == "__main__": 

    printer_info_level = 1 

    for printer_info in win32print.EnumPrinters(win32print.PRINTER_ENUM_LOCAL, None, printer_info_level): 
     name = printer_info[2] 
     #print(printer_info) 
     printer_handle = win32print.OpenPrinter(name) 
     job_info_level = 1 
     job_info_tuple = win32print.EnumJobs(printer_handle, 0, -1, job_info_level) 
     #print(type(job_info_tuple), len(job_info_tuple)) 
     for job_info in job_info_tuple: 
      #print("\t", type(job_info), job_info, dir(job_info)) 
      win32print.SetJob(printer_handle, job_info["JobId"], job_info_level, job_info, win32print.JOB_CONTROL_DELETE) 
     win32print.ClosePrinter(printer_handle) 

注意

  • 我在評論說的話(約迭代打印機)仍然有效,但我想這超出了這個問題的範圍
  • 我已經改進了一點腳本:
    • 給(更多)有意義的名稱變量
    • 使用變量,而不是簡單的數字來提高代碼的可讀性
    • 其他小的修正
    • 也許,這可以使用一些異常處理
  • 祕密的腳本包括:
    • EnumJobs返回一個元組 of 個字典(其中每個字典封裝了[MSDN]: JOB_INFO_1 structure - 爲job_info_level = 1),如果有,或(顯然)一個空的元組沒有排隊的作業打印機
    • 如何從EnumJobs的信息傳遞給SetJob
      • JobID參數(你問)是job_info["JobId"](查看上一段落)
      • 還要注意接下來的2個參數:LevelJobInfo