我有一个文本文件,可以使用任务计划程序自动下载和更新。
看起来像这样:
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">
我想:
该电子邮件中的内容并不重要(之后我将使用webservice手动检查)。 我只需要将其作为剩余/报警器,因为某些打印机墨粉不足,所以我不必每天手动检查txt文件(我肯定会忘记:))。这些打印机是非现场的,所以我需要事先知道打印机是低的。
注1:该txt的开头有空行和空格
注意2:不,当在这些打印机上配置低碳粉时,没有通过电子邮件发送报告(我仔细检查过)。
Note3:使用C:\ Windows \ System32 \ WindowsPowerShell \ v1.0 \ powershell.exe
我猜第一点和第二点是可选的。第三个对我来说很重要,我用Google搜索了类似的东西,但是因为每个人都想要一些不同的东西而迷失了。
由于
答案 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的情况下才能使用