ila 发表于 2015-12-3 11:06:31

【已解决】关于在win32_printer匹配两个属性的问题

本帖最后由 ila 于 2015-12-4 16:28 编辑

目标:
根据Caption匹配得到的信息里获取Attributes的值。
需要获取现有已安装打印机的Attributes值。
我现在是这样子写,不知道是否正确。$StrComputer="."
$obj=ObjGet("winmgmts:\\"&$StrComputer&"\root\CIMV2")
$colitems=$obj.ExecQuery("Select * from Win32_Printer")
For $objitem In $colitems
    If $objitem.Caption=="SHARP AR-1808S" Then MsgBox (0,0,$objitem.Attributes)
Next

虫子樱桃 发表于 2015-12-3 14:54:47

我这边测试是OK的,但是不晓得你要进行什么操作~~

添加tcp/ip打印端口,设置默认打印机这些操作貌似不需要你说的这个属性~

ila 发表于 2015-12-3 16:30:26

本帖最后由 ila 于 2015-12-3 16:40 编辑

回复 2# 虫子樱桃


实在受不了部分员工操作时把打印机搞的脱机,想找代码判断状态,然后把打印机恢复联机。
有些打印机如果把数据弄掉了,立马变脱机,插回去还是一样脱机。

为了检测某个打印机的状态是联机还是脱机,
理论上可以这样:
$StrComputer="."
$obj=ObjGet("winmgmts:\\"&$StrComputer&"\root\CIMV2")
$colitems=$obj.ExecQuery("Select * from Win32_Printer")
For $objitem In $colitems
        If $objitem.Caption=="SHARP AR-1808S" Then
                $a=Int($objitem.Attributes / 1024)
                If Mod($a, 2)=0 Then
                        MsgBox(0,0,"联机",8)
                ElseIf Mod($a, 2)=1 Then
                        MsgBox(0,0,"脱机",8)
                Else
                        MsgBox(0,0,"谁知道",8)
                EndIf
        EndIf
next
ps:请问把打印机恢复联机的代码从哪里来实现?

cfanpc 发表于 2015-12-3 16:31:04

回复 2# 虫子樱桃


    樱桃你知道SCIT自动补充括号和双引号的代码是什么嘛!!!

虫子樱桃 发表于 2015-12-4 11:23:22

回复 3# ila
已经测试成功,望对你有所帮助,请修改标题为【已解决】
$StrComputer="."
$obj=ObjGet("winmgmts:\\"&$StrComputer&"\root\CIMV2")
$colitems=$obj.ExecQuery("Select * from Win32_Printer")
For $objitem In $colitems
      If $objitem.Caption=="SHARP AR-1808S" Then
                $a=Int($objitem.Attributes / 1024)
                If Mod($a, 2)=0 Then
                        MsgBox(0,0,"打印机当前状态为联机",8)
                                        ElseIf Mod($a, 2)=1 Then
                        MsgBox(0,0,"打印机当前状态为脱机,点确定后将设置为联机",8)
                                                ;核心代码
                                                $objitem.WorkOffline = False
                                                $objitem.Put_
                                                ;~~~~~~~~~~~~~~~~~~~~~~
                                                MsgBox(0,'','已经设置打印机为联机状态')
                Else
                        MsgBox(0,0,"不晓得",8)
                EndIf
      EndIf
next

虫子樱桃 发表于 2015-12-4 11:53:58

回复 4# cfanpc
这个不是很清楚了,好久没改配置文件了~~

ila 发表于 2015-12-4 14:00:34

本帖最后由 ila 于 2015-12-4 14:06 编辑

回复ila
已经测试成功,望对你有所帮助,请修改标题为【已解决】
虫子樱桃 发表于 2015-12-4 11:23 http://www.autoitx.com/images/common/back.gif
很感谢回复。
请问$objitem.Put_这句是把$objitem.WorkOffline = False运行?
即把WorkOffline 状态改成False?

虫子樱桃 发表于 2015-12-4 14:42:38

回复 7# ila


   是的,WorkOffline属性,分别使用true和false来标识是否离线使用打印机

ila 发表于 2015-12-4 16:01:44

回复ila


   是的,WorkOffline属性,分别使用true和false来标识是否离线使用打印机
虫子樱桃 发表于 2015-12-4 14:42 http://www.autoitx.com/images/common/back.gif


   请问 $objitem.Put_是只针对WorkOffline还是其他情况也适用?
在那些wmi查询工具里找不到这个资料。

虫子樱桃 发表于 2015-12-4 16:10:29

回复 9# ila


    其他情况也适用

ila 发表于 2015-12-4 23:48:37

本帖最后由 ila 于 2015-12-5 14:25 编辑

用python的wmi模块写了一遍,发现编译器提示最后一行的Put_方法出错。
在一个python群看到你的qq,也请你有空看看这那里出错。Traceback (most recent call last):
File "C:\1.py", line 10, in <module>
    printt.WorkOffLine=False
File "C:\Python27\lib\site-packages\wmi.py", line 576, in __setattr__
    raise AttributeError (attribute)
AttributeError: WorkOffLine附上py的代码:import wmi
c=wmi.WMI()
wql="Select * from Win32_Printer where Caption='Adobe PDF'"
for printt in c.query(wql):
    (x,y)=divmod(int(printt.Attributes /1024),2)
    if y==0:
      print "lianji"
    else:
      print "tuoji"
      printt.WorkOffLine=False
      printt.Put_
win3com.client模块也一样,Put_无法实现。import win32com.client
strComputer="."
obj=win32com.client.Dispatch("WbemScripting.SwbemLocator")
objj=obj.ConnectServer(strComputer,"root\cimv2")
colItems=objj.ExecQuery("Select * from Win32_Printer where Caption='Adobe PDF'")
for objItem in colItems:
    (x,y)=divmod(int(objItem.Attributes / 1024),2)
    if y==0:
      print "lianji"
    else:
      print "tuoji"
      objItem.WorkOffline=False
      objItem.Put_

ila 发表于 2015-12-5 09:37:56

顺手把恢复打印也贴上:
bat代码cscript prnqctl.vbs -m-p "Adobe PDF"

虫子樱桃 发表于 2015-12-5 18:16:49

回复 12# ila
python我也不是很熟悉,只是才学,有个模块,估计可以,但是我还不懂怎么样正确使用,研究的代码只有下面的这些了#!/usr/bin/python34
# -*- coding: utf-8 -*-

import win32print
#pdfFactory Pro
objprinter = win32print.OpenPrinter('pdfFactory Pro')
print(objprinter)
dget = win32print.GetPrinter(objprinter,2)
print(dget)
win32print.SetPrinter(objprinter,2,dget,win32print.PORT_STATUS_OFFLINE)
参考
http://timgolden.me.uk/pywin32-docs/win32print__SetPrinter_meth.html
http://timgolden.me.uk/pywin32-docs/win32print__GetPrinter_meth.html
http://timgolden.me.uk/pywin32-docs/win32print__OpenPrinter_meth.html

ila 发表于 2015-12-5 21:11:56

回复ila
python我也不是很熟悉,只是才学,有个模块,估计可以,但是我还不懂怎么样正确使用,研究的代 ...
虫子樱桃 发表于 2015-12-5 18:16 http://www.autoitx.com/images/common/back.gif


   感谢回复,忘记win32print这个模块了,我试试。
页: [1]
查看完整版本: 【已解决】关于在win32_printer匹配两个属性的问题