通过 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]! ...
)
我被要求编写一个程序,询问网络中所有打印机的名称、位置和 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]! ...
)