powershell - 获取文件,解析它以及“value =”<然后X函数sendMail

时间:2014-06-03 13:42:40

标签: powershell

我有一个文本文件,可以使用任务计划程序自动下载和更新。

看起来像这样:

C:\PrintLog\GetUsageReportFromPrinterWebService\10.22.17.102:58:<input type="hidden" name="AVAILABELBLACKTONER" value="60">
C:\PrintLog\GetUsageReportFromPrinterWebService\192.167.10.140:58:<input type="hidden" name="AVAILABELBLACKTONER" value="80">
C:\PrintLog\GetUsageReportFromPrinterWebService\192.167.14.128:58:<input type="hidden" name="AVAILABELBLACKTONER" value="80">

我想:

  1. 删除&#34; C:\ PrintLog \ GetUsageReportFromPrinterWebService \&#34;和&#34;输入类型=&#34;隐藏&#34;名称=&#34; AVAILIBLETONER&#34;&#34;
  2. 用打印机名称替换该IP地址(示例10.51.17.122:58等于HP-01,192.168.10.150:58等于HP-02等)
  3. 检查&#34;值=&#34;小于20,如果是,则发送带有sendMail功能的电子邮件
  4. 该电子邮件中的内容并不重要(之后我将使用webservice手动检查)。 我只需要将其作为剩余/报警器,因为某些打印机墨粉不足,所以我不必每天手动检查txt文件(我肯定会忘记:))。这些打印机是非现场的,所以我需要事先知道打印机是低的。

    注1:该txt的开头有空行和空格

    注意2:不,当在这些打印机上配置低碳粉时,没有通过电子邮件发送报告(我仔细检查过)。

    Note3:使用C:\ Windows \ System32 \ WindowsPowerShell \ v1.0 \ powershell.exe

    我猜第一点和第二点是可选的。第三个对我来说很重要,我用Google搜索了类似的东西,但是因为每个人都想要一些不同的东西而迷失了。

    由于

2 个答案:

答案 0 :(得分:1)

这是另一种可能性(我认为它需要Powershell 4,因为Send-Mailmessage,但我可能错了):

#requires -version 4.0

$logs = Get-Content "F:\scripts\ParseLog\file.log"

$warning = $false
$lowPrinters = ""

# Mail Settings
$Subject = "Low Toner Warning"
$To = "printeradmin@contoso.com"
$From = "admin@contoso.com"
$SMTPServer = "smtp.contoso.com"
$Priority = "High"

$printerList = @{
    "10.51.17.122:58" = "HP-01"; 
    "192.168.10.150:58" = "HP-02";
    "10.22.17.102:58" = "HP-03";
    "192.167.10.140:58" = "HP-04";
}

foreach ( $log in $logs ) {
    if ( $log -match '^C:\\PrintLog\\GetUsageReportFromPrinterWebService\\([^:]+:[^:]+):.*value="(.*)">$' ) {
        $printer = $Matches[1]
        $toner = [int]$Matches[2]
    }

    if( $toner -lt 20 ) {
        $warning = $true
        if( $printerList.ContainsKey( $printer ) ) {
            $printerName = $printerList[ $printer ]
        } else {
            $printerName = $printer
        }
        $lowPrinters += "Printer {0} has a low toner level of {1}.`n" -f $printerName, $toner
    }
}

if( $warning ) {
    Send-MailMessage -From $From -To $To -Subject $Subject -body $lowPrinters -SmtpServer $SMTPServer
}

沿着第8行,我们设置了一些发送电子邮件的东西。从第15行开始,我们构建一个哈希表映射具有打印机名称的打印机IP /端口(因为打印机队列并不总是在DNS中列出,所以我决定使用哈希表)。在第23行,我们使用正则表达式来获取ip和端口,并使用-match运算符获取碳粉值。正则表达式抓取的东西存储在名为$Matches的数组中。

答案 1 :(得分:0)

举个例子,你可以这样做:

$filePath = "C:\updatedFile.txt"
$prefix   = "C:\PrintLog\GetUsageReportFromPrinterWebService\"
$lines    = Get-Content $filePath |Where-Object {$_.Trim() -like "$($prefix)*"}

foreach($line in $lines)
{
    $content = $line.Trim().Substring($prefix.Length)
    $parts   = $content -split ":"
    $inputML = [xml]"$($parts[2])</input>"
    $inputValue = [int]$inputML.input.value

    if($inputValue -lt 20)
    {
        $printer = [System.Net.DNS]::GetHostByAddress($parts[0]).HostName
        <#
            Your sendMail call in here
        #>
    }

}

使用Substring()删除“C:\ PrintLog \ GetUsageReportFromPrinterWebService”部分,将其拆分为3个部分,然后将最后部分解析为xml元素,以便更轻松地访问{{1} 1}}属性

IP到打印机名称部分仅在您已有反向DNS的情况下才能使用