找回密码
 加入
搜索
查看: 4324|回复: 13

[系统综合] 【已解决】关于在win32_printer匹配两个属性的问题

  [复制链接]
发表于 2015-12-3 11:06:31 | 显示全部楼层 |阅读模式
本帖最后由 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打印端口,设置默认打印机这些操作貌似不需要你说的这个属性~

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
 楼主| 发表于 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:请问把打印机恢复联机的代码从哪里来实现?
发表于 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

评分

参与人数 1金钱 +30 收起 理由
ila + 30 知识是无价的,谢谢回复。

查看全部评分

发表于 2015-12-4 11:53:58 | 显示全部楼层
回复 4# cfanpc
这个不是很清楚了,好久没改配置文件了~~
 楼主| 发表于 2015-12-4 14:00:34 | 显示全部楼层
本帖最后由 ila 于 2015-12-4 14:06 编辑
回复  ila
已经测试成功,望对你有所帮助,请修改标题为【已解决】
虫子樱桃 发表于 2015-12-4 11:23

很感谢回复。
请问$objitem.Put_这句是把$objitem.WorkOffline = False运行?
即把WorkOffline 状态改成False?
发表于 2015-12-4 14:42:38 | 显示全部楼层
回复 7# ila


   是的,WorkOffline属性,分别使用true和false来标识是否离线使用打印机
 楼主| 发表于 2015-12-4 16:01:44 | 显示全部楼层
回复  ila


   是的,WorkOffline属性,分别使用true和false来标识是否离线使用打印机
虫子樱桃 发表于 2015-12-4 14:42



   请问 $objitem.Put_是只针对WorkOffline还是其他情况也适用?
在那些wmi查询工具里找不到这个资料。
发表于 2015-12-4 16:10:29 | 显示全部楼层
回复 9# 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_
 楼主| 发表于 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-d ... etPrinter_meth.html
http://timgolden.me.uk/pywin32-d ... etPrinter_meth.html
http://timgolden.me.uk/pywin32-d ... enPrinter_meth.html
 楼主| 发表于 2015-12-5 21:11:56 | 显示全部楼层
回复  ila
python我也不是很熟悉,只是才学,有个模块,估计可以,但是我还不懂怎么样正确使用,研究的代 ...
虫子樱桃 发表于 2015-12-5 18:16



   感谢回复,忘记win32print这个模块了,我试试。
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-9-28 22:18 , Processed in 0.097468 second(s), 25 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表