Powershell Foreach 写输出
Powershell Foreach Write-Output
我是 Powershell 的新手。但长话短说,我正在构建一个应用程序来通过 SNMP 监控设备。由于 SNMP 通过 powershell 非常基本,我的计划是每隔一段时间安排一个脚本到 运行,它将从多个 IP 地址轮询 snmp 数据。计划是将所有 OIDS 中的所有字符串输出到 .txt 文件,然后将 .txt 文件中的内容导入 Python.
中内置的 GUI
我目前的问题是输出。我让轮询工作,但由于输出在循环内,输出要么加倍,要么被覆盖。在目前的设置中,有没有什么方法可以输出而不覆盖数据,同时不复制文件中已经写入的数据?
目前我的脚本是这样的:
$ips = Get-Content "C:\temp\ip.txt"
foreach($ip in $ips) {
$SNMP = New-Object -ComObject olePrn.OleSNMP
$SNMP.open($ip,'public',3,1000)
$hostname = $SNMP.Get(".1.3.6.1.2.1.1.5.0")
$blacktonercap = $SNMP.Get(".1.3.6.1.2.1.43.11.1.1.8.1.1")
$blacktonerlvl = $SNMP.Get(".1.3.6.1.2.1.43.11.1.1.9.1.1")
$cyantonercap = $SNMP.Get(".1.3.6.1.2.1.43.11.1.1.8.1.2")
$cyantonerlvl = $SNMP.Get(".1.3.6.1.2.1.43.11.1.1.9.1.2")
$magentatonercap = $SNMP.Get(".1.3.6.1.2.1.43.11.1.1.8.1.3")
$magentatonerlvl = $SNMP.Get(".1.3.6.1.2.1.43.11.1.1.9.1.3")
$yellowtonercap = $SNMP.Get(".1.3.6.1.2.1.43.11.1.1.8.1.4")
$yellowtonerlvl = $SNMP.Get(".1.3.6.1.2.1.43.11.1.1.9.1.4")
$drumR1 = $SNMP.Get(".1.3.6.1.2.1.43.11.1.1.9.1.5")
$drumR2 = $SNMP.Get(".1.3.6.1.2.1.43.11.1.1.9.1.6")
$drumR3 = $SNMP.Get(".1.3.6.1.2.1.43.11.1.1.9.1.7")
$drumR4 = $SNMP.Get(".1.3.6.1.2.1.43.11.1.1.9.1.8")
$wastebox = $SNMP.Get(".1.3.6.1.2.1.43.11.1.1.9.1.10")
$transferbelt = $SNMP.Get(".1.3.6.1.2.1.43.11.1.1.9.1.11") #överföringsband
$phaser = $SNMP.Get(".1.3.6.1.2.1.43.11.1.1.9.1.12") #överföringsrulle
$Blacktonerstatus = [Math]::round($blacktonerlvl/$blacktonercap*100)
$Cyantonerstatus = [Math]::round($cyantonerlvl/$cyantonercap*100)
$magentatonerstatus = [Math]::round($magentatonerlvl/$magentatonercap*100)
$yellowtonerstatus = [Math]::round($yellowtonerlvl/$yellowtonercap*100)
Write-Output $hostname "Svart toner" $blacktonerstatus"%" "Cyan toner" $cyantonerstatus"%" "Magenta toner" $magentatonerstatus"%" "Gul toner" $yellowtonerstatus"%" "Trumkassett R1" $drumR1"%" "Trumkassett R2" $drumR2"%" "Trumkassett R3" $drumR3"%" "Trumkassett R4" $drumR4"%" "Överskottsbehållare" $wastebox"%" "Överföringsband" $transferbelt"%" "Överföringsrulle" $phaser"%" >> "C:\temp\test.txt"
$SNMP.close
}
请注意,此代码只是一个测试,看看我是否可以让它工作,因此是一团糟。
第二次 运行 脚本时,输出看起来像这样:
Hostname1
Svart toner
11%
Cyan toner
1%
Magenta toner
1%
Gul toner
50%
Trumkassett R1
79%
Trumkassett R2
26%
Trumkassett R3
21%
Trumkassett R4
15%
Överskottsbehållare
100%
Överföringsband
24%
Överföringsrulle
59%
Hostname2
Svart toner
42%
Cyan toner
100%
Magenta toner
88%
Gul toner
95%
Trumkassett R1
0%
Trumkassett R2
72%
Trumkassett R3
69%
Trumkassett R4
98%
Överskottsbehållare
100%
Överföringsband
41%
Överföringsrulle
41%
Hostname1
Svart toner
11%
Cyan toner
1%
Magenta toner
1%
Gul toner
50%
Trumkassett R1
79%
Trumkassett R2
26%
Trumkassett R3
21%
Trumkassett R4
15%
Överskottsbehållare
100%
Överföringsband
24%
Överföringsrulle
59%
Hostname
Svart toner
42%
Cyan toner
100%
Magenta toner
88%
Gul toner
95%
Trumkassett R1
0%
Trumkassett R2
72%
Trumkassett R3
69%
Trumkassett R4
98%
Överskottsbehållare
100%
Överföringsband
41%
Överföringsrulle
41%
您可以将输出放入数组,我想这将是最干净的解决方案。
$ips = Get-Content "C:\temp\printer.txt"
$output = @()
foreach($ip in $ips)
{
$SNMP = New-Object -ComObject olePrn.OleSNMP
$SNMP.open($ip,'public',3,1000)
$props = @{
hostname = $SNMP.Get(".1.3.6.1.2.1.1.5.0")
blacktonercap = $SNMP.Get(".1.3.6.1.2.1.43.11.1.1.8.1.1")
blacktonerlvl = $SNMP.Get(".1.3.6.1.2.1.43.11.1.1.9.1.1")
cyantonercap = $SNMP.Get(".1.3.6.1.2.1.43.11.1.1.8.1.2")
cyantonerlvl = $SNMP.Get(".1.3.6.1.2.1.43.11.1.1.9.1.2")
magentatonercap = $SNMP.Get(".1.3.6.1.2.1.43.11.1.1.8.1.3")
magentatonerlvl = $SNMP.Get(".1.3.6.1.2.1.43.11.1.1.9.1.3")
yellowtonercap = $SNMP.Get(".1.3.6.1.2.1.43.11.1.1.8.1.4")
yellowtonerlvl = $SNMP.Get(".1.3.6.1.2.1.43.11.1.1.9.1.4")
drumR1 = $SNMP.Get(".1.3.6.1.2.1.43.11.1.1.9.1.5")
drumR2 = $SNMP.Get(".1.3.6.1.2.1.43.11.1.1.9.1.6")
drumR3 = $SNMP.Get(".1.3.6.1.2.1.43.11.1.1.9.1.7")
drumR4 = $SNMP.Get(".1.3.6.1.2.1.43.11.1.1.9.1.8")
wastebox = $SNMP.Get(".1.3.6.1.2.1.43.11.1.1.9.1.10")
transferbelt = $SNMP.Get(".1.3.6.1.2.1.43.11.1.1.9.1.11")
phaser = $SNMP.Get(".1.3.6.1.2.1.43.11.1.1.9.1.12")
}
$ServiceObject = New-Object -TypeName PSObject -Property $props
$output += $ServiceObject
$SNMP.close
}
$output | export-csv "C:\temp\printer_test.csv" -notypeinformation
有两种计算方式:
- 在为数组填充属性之前获取 SNMP 数据,然后您可以使用之前创建的变量进行计算。
$blacktonercap = $SNMP.Get(".1.3.6.1.2.1.43.11.1.1.8.1.1")
$blacktonerlvl = $SNMP.Get(".1.3.6.1.2.1.43.11.1.1.9.1.1")
$cyantonercap = $SNMP.Get(".1.3.6.1.2.1.43.11.1.1.8.1.2")
$cyantonerlvl = $SNMP.Get(".1.3.6.1.2.1.43.11.1.1.9.1.2")
$magentatonercap = $SNMP.Get(".1.3.6.1.2.1.43.11.1.1.8.1.3")
$magentatonerlvl = $SNMP.Get(".1.3.6.1.2.1.43.11.1.1.9.1.3")
$yellowtonercap = $SNMP.Get(".1.3.6.1.2.1.43.11.1.1.8.1.4")
$yellowtonerlvl = $SNMP.Get(".1.3.6.1.2.1.43.11.1.1.9.1.4")
$props = @{
blacktonercap = $blacktonercap
blacktonerlvl = $blacktonerlvl
cyantonercap = $cyantonercap
cyantonerlvl = $cyantonerlvl
magentatonercap = $magentatonercap
magentatonerlvl = $magentatonerlvl
yellowtonercap = $yellowtonercap
yellowtonerlvl = $yellowtonerlvl
drumR1 = $SNMP.Get(".1.3.6.1.2.1.43.11.1.1.9.1.5")
drumR2 = $SNMP.Get(".1.3.6.1.2.1.43.11.1.1.9.1.6")
drumR3 = $SNMP.Get(".1.3.6.1.2.1.43.11.1.1.9.1.7")
drumR4 = $SNMP.Get(".1.3.6.1.2.1.43.11.1.1.9.1.8")
wastebox = $SNMP.Get(".1.3.6.1.2.1.43.11.1.1.9.1.10")
transferbelt = $SNMP.Get(".1.3.6.1.2.1.43.11.1.1.9.1.11")
phaser = $SNMP.Get(".1.3.6.1.2.1.43.11.1.1.9.1.12")
Blacktonerstatus = [Math]::round($blacktonerlvl/$blacktonercap*100)
Cyantonerstatus = [Math]::round($cyantonerlvl/$cyantonercap*100)
magentatonerstatus = [Math]::round($magentatonerlvl/$magentatonercap*100)
yellowtonerstatus = [Math]::round($yellowtonerlvl/$yellowtonercap*100)
}
- 你在计算的时候直接得到数据,但是这意味着你必须得到两次SNMP数据。
$props = @{
hostname = $SNMP.Get(".1.3.6.1.2.1.1.5.0")
blacktonercap = $SNMP.Get(".1.3.6.1.2.1.43.11.1.1.8.1.1")
blacktonerlvl = $SNMP.Get(".1.3.6.1.2.1.43.11.1.1.9.1.1")
cyantonercap = $SNMP.Get(".1.3.6.1.2.1.43.11.1.1.8.1.2")
cyantonerlvl = $SNMP.Get(".1.3.6.1.2.1.43.11.1.1.9.1.2")
magentatonercap = $SNMP.Get(".1.3.6.1.2.1.43.11.1.1.8.1.3")
magentatonerlvl = $SNMP.Get(".1.3.6.1.2.1.43.11.1.1.9.1.3")
yellowtonercap = $SNMP.Get(".1.3.6.1.2.1.43.11.1.1.8.1.4")
yellowtonerlvl = $SNMP.Get(".1.3.6.1.2.1.43.11.1.1.9.1.4")
drumR1 = $SNMP.Get(".1.3.6.1.2.1.43.11.1.1.9.1.5")
drumR2 = $SNMP.Get(".1.3.6.1.2.1.43.11.1.1.9.1.6")
drumR3 = $SNMP.Get(".1.3.6.1.2.1.43.11.1.1.9.1.7")
drumR4 = $SNMP.Get(".1.3.6.1.2.1.43.11.1.1.9.1.8")
wastebox = $SNMP.Get(".1.3.6.1.2.1.43.11.1.1.9.1.10")
transferbelt = $SNMP.Get(".1.3.6.1.2.1.43.11.1.1.9.1.11")
phaser = $SNMP.Get(".1.3.6.1.2.1.43.11.1.1.9.1.12")
Blacktonerstatus = [Math]::round(($SNMP.Get(".1.3.6.1.2.1.43.11.1.1.9.1.1"))/($SNMP.Get(".1.3.6.1.2.1.43.11.1.1.8.1.1"))*100)
Cyantonerstatus = [Math]::round(($SNMP.Get(".1.3.6.1.2.1.43.11.1.1.9.1.2"))/($SNMP.Get(".1.3.6.1.2.1.43.11.1.1.8.1.2"))*100)
magentatonerstatus = [Math]::round(($SNMP.Get(".1.3.6.1.2.1.43.11.1.1.9.1.3"))/($SNMP.Get(".1.3.6.1.2.1.43.11.1.1.8.1.3"))*100)
yellowtonerstatus = [Math]::round(($SNMP.Get(".1.3.6.1.2.1.43.11.1.1.9.1.4"))/($SNMP.Get(".1.3.6.1.2.1.43.11.1.1.8.1.4"))*100)
}
老实说,两者都不完美,但应该可以。
我是 Powershell 的新手。但长话短说,我正在构建一个应用程序来通过 SNMP 监控设备。由于 SNMP 通过 powershell 非常基本,我的计划是每隔一段时间安排一个脚本到 运行,它将从多个 IP 地址轮询 snmp 数据。计划是将所有 OIDS 中的所有字符串输出到 .txt 文件,然后将 .txt 文件中的内容导入 Python.
中内置的 GUI我目前的问题是输出。我让轮询工作,但由于输出在循环内,输出要么加倍,要么被覆盖。在目前的设置中,有没有什么方法可以输出而不覆盖数据,同时不复制文件中已经写入的数据?
目前我的脚本是这样的:
$ips = Get-Content "C:\temp\ip.txt"
foreach($ip in $ips) {
$SNMP = New-Object -ComObject olePrn.OleSNMP
$SNMP.open($ip,'public',3,1000)
$hostname = $SNMP.Get(".1.3.6.1.2.1.1.5.0")
$blacktonercap = $SNMP.Get(".1.3.6.1.2.1.43.11.1.1.8.1.1")
$blacktonerlvl = $SNMP.Get(".1.3.6.1.2.1.43.11.1.1.9.1.1")
$cyantonercap = $SNMP.Get(".1.3.6.1.2.1.43.11.1.1.8.1.2")
$cyantonerlvl = $SNMP.Get(".1.3.6.1.2.1.43.11.1.1.9.1.2")
$magentatonercap = $SNMP.Get(".1.3.6.1.2.1.43.11.1.1.8.1.3")
$magentatonerlvl = $SNMP.Get(".1.3.6.1.2.1.43.11.1.1.9.1.3")
$yellowtonercap = $SNMP.Get(".1.3.6.1.2.1.43.11.1.1.8.1.4")
$yellowtonerlvl = $SNMP.Get(".1.3.6.1.2.1.43.11.1.1.9.1.4")
$drumR1 = $SNMP.Get(".1.3.6.1.2.1.43.11.1.1.9.1.5")
$drumR2 = $SNMP.Get(".1.3.6.1.2.1.43.11.1.1.9.1.6")
$drumR3 = $SNMP.Get(".1.3.6.1.2.1.43.11.1.1.9.1.7")
$drumR4 = $SNMP.Get(".1.3.6.1.2.1.43.11.1.1.9.1.8")
$wastebox = $SNMP.Get(".1.3.6.1.2.1.43.11.1.1.9.1.10")
$transferbelt = $SNMP.Get(".1.3.6.1.2.1.43.11.1.1.9.1.11") #överföringsband
$phaser = $SNMP.Get(".1.3.6.1.2.1.43.11.1.1.9.1.12") #överföringsrulle
$Blacktonerstatus = [Math]::round($blacktonerlvl/$blacktonercap*100)
$Cyantonerstatus = [Math]::round($cyantonerlvl/$cyantonercap*100)
$magentatonerstatus = [Math]::round($magentatonerlvl/$magentatonercap*100)
$yellowtonerstatus = [Math]::round($yellowtonerlvl/$yellowtonercap*100)
Write-Output $hostname "Svart toner" $blacktonerstatus"%" "Cyan toner" $cyantonerstatus"%" "Magenta toner" $magentatonerstatus"%" "Gul toner" $yellowtonerstatus"%" "Trumkassett R1" $drumR1"%" "Trumkassett R2" $drumR2"%" "Trumkassett R3" $drumR3"%" "Trumkassett R4" $drumR4"%" "Överskottsbehållare" $wastebox"%" "Överföringsband" $transferbelt"%" "Överföringsrulle" $phaser"%" >> "C:\temp\test.txt"
$SNMP.close
}
请注意,此代码只是一个测试,看看我是否可以让它工作,因此是一团糟。
第二次 运行 脚本时,输出看起来像这样:
Hostname1
Svart toner
11%
Cyan toner
1%
Magenta toner
1%
Gul toner
50%
Trumkassett R1
79%
Trumkassett R2
26%
Trumkassett R3
21%
Trumkassett R4
15%
Överskottsbehållare
100%
Överföringsband
24%
Överföringsrulle
59%
Hostname2
Svart toner
42%
Cyan toner
100%
Magenta toner
88%
Gul toner
95%
Trumkassett R1
0%
Trumkassett R2
72%
Trumkassett R3
69%
Trumkassett R4
98%
Överskottsbehållare
100%
Överföringsband
41%
Överföringsrulle
41%
Hostname1
Svart toner
11%
Cyan toner
1%
Magenta toner
1%
Gul toner
50%
Trumkassett R1
79%
Trumkassett R2
26%
Trumkassett R3
21%
Trumkassett R4
15%
Överskottsbehållare
100%
Överföringsband
24%
Överföringsrulle
59%
Hostname
Svart toner
42%
Cyan toner
100%
Magenta toner
88%
Gul toner
95%
Trumkassett R1
0%
Trumkassett R2
72%
Trumkassett R3
69%
Trumkassett R4
98%
Överskottsbehållare
100%
Överföringsband
41%
Överföringsrulle
41%
您可以将输出放入数组,我想这将是最干净的解决方案。
$ips = Get-Content "C:\temp\printer.txt"
$output = @()
foreach($ip in $ips)
{
$SNMP = New-Object -ComObject olePrn.OleSNMP
$SNMP.open($ip,'public',3,1000)
$props = @{
hostname = $SNMP.Get(".1.3.6.1.2.1.1.5.0")
blacktonercap = $SNMP.Get(".1.3.6.1.2.1.43.11.1.1.8.1.1")
blacktonerlvl = $SNMP.Get(".1.3.6.1.2.1.43.11.1.1.9.1.1")
cyantonercap = $SNMP.Get(".1.3.6.1.2.1.43.11.1.1.8.1.2")
cyantonerlvl = $SNMP.Get(".1.3.6.1.2.1.43.11.1.1.9.1.2")
magentatonercap = $SNMP.Get(".1.3.6.1.2.1.43.11.1.1.8.1.3")
magentatonerlvl = $SNMP.Get(".1.3.6.1.2.1.43.11.1.1.9.1.3")
yellowtonercap = $SNMP.Get(".1.3.6.1.2.1.43.11.1.1.8.1.4")
yellowtonerlvl = $SNMP.Get(".1.3.6.1.2.1.43.11.1.1.9.1.4")
drumR1 = $SNMP.Get(".1.3.6.1.2.1.43.11.1.1.9.1.5")
drumR2 = $SNMP.Get(".1.3.6.1.2.1.43.11.1.1.9.1.6")
drumR3 = $SNMP.Get(".1.3.6.1.2.1.43.11.1.1.9.1.7")
drumR4 = $SNMP.Get(".1.3.6.1.2.1.43.11.1.1.9.1.8")
wastebox = $SNMP.Get(".1.3.6.1.2.1.43.11.1.1.9.1.10")
transferbelt = $SNMP.Get(".1.3.6.1.2.1.43.11.1.1.9.1.11")
phaser = $SNMP.Get(".1.3.6.1.2.1.43.11.1.1.9.1.12")
}
$ServiceObject = New-Object -TypeName PSObject -Property $props
$output += $ServiceObject
$SNMP.close
}
$output | export-csv "C:\temp\printer_test.csv" -notypeinformation
有两种计算方式:
- 在为数组填充属性之前获取 SNMP 数据,然后您可以使用之前创建的变量进行计算。
$blacktonercap = $SNMP.Get(".1.3.6.1.2.1.43.11.1.1.8.1.1")
$blacktonerlvl = $SNMP.Get(".1.3.6.1.2.1.43.11.1.1.9.1.1")
$cyantonercap = $SNMP.Get(".1.3.6.1.2.1.43.11.1.1.8.1.2")
$cyantonerlvl = $SNMP.Get(".1.3.6.1.2.1.43.11.1.1.9.1.2")
$magentatonercap = $SNMP.Get(".1.3.6.1.2.1.43.11.1.1.8.1.3")
$magentatonerlvl = $SNMP.Get(".1.3.6.1.2.1.43.11.1.1.9.1.3")
$yellowtonercap = $SNMP.Get(".1.3.6.1.2.1.43.11.1.1.8.1.4")
$yellowtonerlvl = $SNMP.Get(".1.3.6.1.2.1.43.11.1.1.9.1.4")
$props = @{
blacktonercap = $blacktonercap
blacktonerlvl = $blacktonerlvl
cyantonercap = $cyantonercap
cyantonerlvl = $cyantonerlvl
magentatonercap = $magentatonercap
magentatonerlvl = $magentatonerlvl
yellowtonercap = $yellowtonercap
yellowtonerlvl = $yellowtonerlvl
drumR1 = $SNMP.Get(".1.3.6.1.2.1.43.11.1.1.9.1.5")
drumR2 = $SNMP.Get(".1.3.6.1.2.1.43.11.1.1.9.1.6")
drumR3 = $SNMP.Get(".1.3.6.1.2.1.43.11.1.1.9.1.7")
drumR4 = $SNMP.Get(".1.3.6.1.2.1.43.11.1.1.9.1.8")
wastebox = $SNMP.Get(".1.3.6.1.2.1.43.11.1.1.9.1.10")
transferbelt = $SNMP.Get(".1.3.6.1.2.1.43.11.1.1.9.1.11")
phaser = $SNMP.Get(".1.3.6.1.2.1.43.11.1.1.9.1.12")
Blacktonerstatus = [Math]::round($blacktonerlvl/$blacktonercap*100)
Cyantonerstatus = [Math]::round($cyantonerlvl/$cyantonercap*100)
magentatonerstatus = [Math]::round($magentatonerlvl/$magentatonercap*100)
yellowtonerstatus = [Math]::round($yellowtonerlvl/$yellowtonercap*100)
}
- 你在计算的时候直接得到数据,但是这意味着你必须得到两次SNMP数据。
$props = @{
hostname = $SNMP.Get(".1.3.6.1.2.1.1.5.0")
blacktonercap = $SNMP.Get(".1.3.6.1.2.1.43.11.1.1.8.1.1")
blacktonerlvl = $SNMP.Get(".1.3.6.1.2.1.43.11.1.1.9.1.1")
cyantonercap = $SNMP.Get(".1.3.6.1.2.1.43.11.1.1.8.1.2")
cyantonerlvl = $SNMP.Get(".1.3.6.1.2.1.43.11.1.1.9.1.2")
magentatonercap = $SNMP.Get(".1.3.6.1.2.1.43.11.1.1.8.1.3")
magentatonerlvl = $SNMP.Get(".1.3.6.1.2.1.43.11.1.1.9.1.3")
yellowtonercap = $SNMP.Get(".1.3.6.1.2.1.43.11.1.1.8.1.4")
yellowtonerlvl = $SNMP.Get(".1.3.6.1.2.1.43.11.1.1.9.1.4")
drumR1 = $SNMP.Get(".1.3.6.1.2.1.43.11.1.1.9.1.5")
drumR2 = $SNMP.Get(".1.3.6.1.2.1.43.11.1.1.9.1.6")
drumR3 = $SNMP.Get(".1.3.6.1.2.1.43.11.1.1.9.1.7")
drumR4 = $SNMP.Get(".1.3.6.1.2.1.43.11.1.1.9.1.8")
wastebox = $SNMP.Get(".1.3.6.1.2.1.43.11.1.1.9.1.10")
transferbelt = $SNMP.Get(".1.3.6.1.2.1.43.11.1.1.9.1.11")
phaser = $SNMP.Get(".1.3.6.1.2.1.43.11.1.1.9.1.12")
Blacktonerstatus = [Math]::round(($SNMP.Get(".1.3.6.1.2.1.43.11.1.1.9.1.1"))/($SNMP.Get(".1.3.6.1.2.1.43.11.1.1.8.1.1"))*100)
Cyantonerstatus = [Math]::round(($SNMP.Get(".1.3.6.1.2.1.43.11.1.1.9.1.2"))/($SNMP.Get(".1.3.6.1.2.1.43.11.1.1.8.1.2"))*100)
magentatonerstatus = [Math]::round(($SNMP.Get(".1.3.6.1.2.1.43.11.1.1.9.1.3"))/($SNMP.Get(".1.3.6.1.2.1.43.11.1.1.8.1.3"))*100)
yellowtonerstatus = [Math]::round(($SNMP.Get(".1.3.6.1.2.1.43.11.1.1.9.1.4"))/($SNMP.Get(".1.3.6.1.2.1.43.11.1.1.8.1.4"))*100)
}
老实说,两者都不完美,但应该可以。