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

有两种计算方式:

  1. 在为数组填充属性之前获取 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)
    }
  1. 你在计算的时候直接得到数据,但是这意味着你必须得到两次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)
}

老实说,两者都不完美,但应该可以。