此问题在此处已有答案:
Powershell Read-Host Not adding or multiplying correctly?(1个答案)
24天前关闭
我有一个非常简单的PowerShell脚本,它使用Select-String从日志文件中提取特定值的最新条目,然后检查该值是否大于或等于1000(通常此值在0-10之间)。如果该值大于或等于1000,则应使用Send-MailMessage发送警报。
这看起来很简单,但我不明白为什么下面的脚本在值远低于1000时(例如,当它等于5或8时)向我发送警报:
# Log file parsing:
$Date = Get-Date -Format "yyMMdd HH:mm:ss"
$LogName = "LOG.log"
$LogFile = Join-Path -Path "C:\DIR1\DIR2\log" -ChildPath $LogName
$LastVALUE = Select-String -Path $LogFile -Pattern 'VALUE:\((\d+)\)' | ForEach-Object {$_.Matches.Groups[1].Value} | select -last 1
# Notification Settings:
$SmtpServer = "redacted.redacted.edu"
$From = "SERVER <[email protected]>"
$Recipients = "<[email protected]>"
$Subject = "VALUE Alert"
$Body = "$Date`: Latest VALUE: $LastVALUE"
if ( $LastVALUE -ge 1000 )
{
Send-MailMessage -SmtpServer $SmtpServer -From $From -To $Recipients -Subject $Subject -Body $Body
}
字符串
此脚本每15分钟由Windows任务管理器调用一次。当值为0(通常为0)时,不发送警报(如预期),但当值大于0但远低于1000时,将发送警报。
在测试时,如果我将条件更改为“-le”,我会收到准确显示值为0(或接近0)的警报。
我已经多次阅读文档以确认我的语法是正确的,但似乎找不到任何明显的解释这种行为。
1条答案
按热度按时间ogsagwnx1#
当前,您正在将字符串与整数进行比较(
$_.Matches.Groups[1].Value
是字符串)。由于字符串位于比较的左侧,因此PowerShell首先将右侧的整数(本例中为1000
)转换为字符串,然后使用指令进行字符串比较,请参阅比较字符串和关于比较运算符。从视觉上说:
字符串
解决方案很简单,你可以将字符串强制转换为整数:
型
或者改变顺序,把整数放在左边,这样强制转换就本质上发生了:
型