通过 SNMP Batch 从打印机获取碳粉量

Get Toner Level from printers via SNMP Batch

我被要求编写一个程序,询问网络中所有打印机的名称、位置和 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 文件时出现的错误消息。

以下是您应该迭代数组的方式:

@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

UPDATE:所以你只需像这样将 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 选项仅打印值。

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

一个可能的解决方案是:

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

或者你用delayed expansion,我觉得这样更快更好:

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

或者,为避免 % 扩展,使用 for 循环,如下所示:

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