【问题标题】:Get Toner Level from printers via SNMP Batch通过 SNMP Batch 从打印机获取碳粉量
【发布时间】:2018-07-11 07:06:00
【问题描述】:

我被要求编写一个程序,询问网络中的所有打印机名称、位置和 CMYK 墨粉(剩余多少百分比)。所以我从 OID 开始,只在一台打印机上尝试过。这行得通。然后我编写了一个 .bat 文件,其中包含我必须执行的所有查询。我为所有 97 台打印机制作了一个阵列。因为我会在代码行中使用数组,所以没有任何效果。在我看来,Codeline 不接受该数组。我搜索了所有内容并尝试了所有内容,但没有任何效果,所以我想问你我的问题是什么。我也想把它写在一个 .txt 文件中。

我的代码:

@echo off

setlocal enableDelayedExpansion 

SET count=0

SET a[0]= 172.22.10.3
SET a[1]= 172.22.10.2
SET a[2]= 172.22.10.1
SET a[3]= 172.22.10.5

snmpwalk -v2c -c public %a[%count%]% 5 1.3.6.1.2.1.25.3.2.1.3.1
>>C:\Temp\Drucker.txt
//Printer Name

snmpwalk -v2c -c public %a[%count%]% 1.3.6.1.2.1.1.6 >>C:\Temp\Drucker.txt
//Printer Location

snmpwalk -v2c -c public %a[%count%]% 1.3.6.1.2.1.43.11.1.1.9.1.4
>>C:\Temp\Drucker.txt
//Black Toner   

snmpwalk -v2c -c public %a[%count%]% 1.3.6.1.2.1.43.11.1.1.9.1.1
>>C:\Temp\Drucker.txt
//Cyan Toner

snmpwalk -v2c -c public %a[%count%]% 1.3.6.1.2.1.43.11.1.1.9.1.2
>>C:\Temp\Drucker.txt
//Magenta Toner

snmpwalk -v2c -c public %a[%count%]% 1.3.6.1.2.1.43.11.1.1.9.1.3
>>C:\Temp\Drucker.txt
//Yellow Toner

endlocal

图片显示我启动 .bat 文件时出现的错误消息。

【问题讨论】:

    标签: arrays batch-file snmp oid


    【解决方案1】:

    问题在于表达式%a[%count%]%,它被解释为一个变量%a[%(空)加上一个文字字符串count加上一个变量%]%(也是空的)。

    一个可能的解决方案是:

    call snmpwalk -v2c -c public %%a[%count%]%% ...
    

    或者你使用delayed expansion,在我看来更快更好:

    setlocal EnableDelayedExpansion
    rem ...
    snmpwalk -v2c -c public !a[%count%]! ...
    rem ...
    endlocal
    

    或者,为了避免%-expansion,使用for 循环,如下所示:

    for %%C in (%count%) do (
        snmpwalk -v2c -c public !a[%%C]! ...
    )
    

    【讨论】:

    • 好的,我尝试了所有三种解决方案,最后一个解决方案根本没有启动,第一个和第二个解决方案出现错误。错误说:“未启用日志处理 - 使用 stderr 日志记录 snmp_build: unknown failuresnmpwalk: Error building ASN.1 representation (Can't build OID for variable )”
    • 抱歉,我根本不知道snmpwalk,我完全不知道它的作用或工作原理;我只是在我的回答中指出了纯 cmd/batch 变量扩展问题...
    【解决方案2】:

    这是您应该遍历数组的方式:

    @echo off 
    setlocal enabledelayedexpansion 
    
    set hosts[0]=172.22.10.3
    set hosts[1]=172.22.10.2
    set hosts[2]=172.22.10.1
    set hosts[3]=172.22.10.5
    
    for /l %%n in (0,1,3) do ( 
       echo !hosts[%%n]! 
    )
    

    输出如下:

    172.22.10.3
    172.22.10.2
    172.22.10.1
    172.22.10.5
    

    更新:所以您只需将 snmpwalk 调用放入循环中,如下所示:

    for /l %%n in (0,1,3) do ( 
        echo Getting data from host: !hosts[%%n]! 
    
        echo Printer Name
        snmpwalk -v2c -c public !hosts[%%n]! 1.3.6.1.2.1.1.5
        echo Printer Location
        snmpwalk -v2c -c public !hosts[%%n]! 1.3.6.1.2.1.1.6 
        echo Black Toner   
        snmpwalk -v2c -c public !hosts[%%n]! 1.3.6.1.2.1.43.11.1.1.9.1.4 
        echo Cyan Toner      
        snmpwalk -v2c -c public !hosts[%%n]! 1.3.6.1.2.1.43.11.1.1.9.1.1
        echo Magenta Toner
        snmpwalk -v2c -c public !hosts[%%n]! 1.3.6.1.2.1.43.11.1.1.9.1.2
        echo Yellow Toner
        snmpwalk -v2c -c public !hosts[%%n]! 1.3.6.1.2.1.43.11.1.1.9.1.3
    )
    

    重要提示:考虑使用 snmpwalk 的 -Oqv 选项仅打印值。

    【讨论】:

    • 是的,我读了很多次,但我应该如何将它放入命令中以询问名称或位置?
    • @Scarlet 我已经更新了答案,向您展示了它应该如何完成
    • @Scarlet 我还建议使用 1.3.6.1.2.1.1.5 来获取名称,因为它更标准并且在 RFC1213 中定义。
    • @AndresKomiagin 非常感谢,你真的让我很开心 :)。现在可以了。只是一个小问题。你知道我怎么只能得到数字吗?因为当我知道将它写入 .txt 时,会有一个 OID 和一些其他词,最后有我需要的数字,是否有一些简单的方法来获取数字?
    • @Scarlet 使用 snmpwalk 的 -Oqv 选项。公开后马上放
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多