使用 PowerShell 通过电子邮件通知获取硬盘驱动器 SMART 数据
Get hard drives SMART data with email notifications using PowerShell
如果
我想使用内部 Windows 资源来跟踪服务器磁盘的健康状况。所以,我想在多台服务器上安排一个 PowerShell 脚本。该脚本应获取每个服务器硬盘驱动器的 SMART 状态,并(通过我的内部 SMTP 服务器)向我发送适当的电子邮件。某些服务器可能包含多个硬盘。
我的初始脚本没问题并且工作正常:
$emailto="admin@example.com"
$emailfrom="$env:COMPUTERNAME@example.com "
$emailserver="smtp.example.com "
$output = Get-WmiObject -query "Select * from Win32_diskdrive" | select Model, Status | out-string
function send-email
{
$EmailSubj = "Disks SMART report on $env:COMPUTERNAME"
$EmailBody = $output
Send-MailMessage -To "$emailto" `
-From "$emailfrom" `
-Subject "$EmailSubj" `
-Body "$EmailBody" `
-smtpServer "$emailserver"
}
send-email
典型的输出是这样的:
Model Status
----- ------
ST2000NC000 OK
ST2000NC000 OK
ST2000NC000 OK
ST2000NC000 OK
问题是只有在 BAD 状态可用时如何避免大量垃圾邮件和电子邮件?我想过滤 Get-WmiObject 结果,以便仅在至少一个 HDD 状态不是 "OK" 时才获取邮件。我不确定,但也应该有 "Degraded" 和 "Pred Fail" 状态。我尝试了不同的 foreach 和 If/Else 组合,但我找不到如何强制 PowerShell 检查 "OK" 字符串的方法状态 属性(以及每个 HDD)以实现我的目标。有人可以帮帮我吗?
如果您丢失了 out-string
,您将可以访问对象属性并能够过滤状态不正常。
但只是一个想法,我宁愿有很多电子邮件,因为那样我会知道脚本是 运行 或者至少一封电子邮件说服务器 1 没有坏扇区等...
$output = Get-WmiObject -query "Select * from Win32_diskdrive" | select Model, Status | where status -ne "OK"
$output = Get-WmiObject -query "Select * from Win32_diskdrive" | select Model, Status
| where-object {$_.Status -ne "OK"} | Out-String
如果状态不等于 "OK",则输出驱动器。这应该考虑任何其他状态选项,包括 "BAD".
如果 我想使用内部 Windows 资源来跟踪服务器磁盘的健康状况。所以,我想在多台服务器上安排一个 PowerShell 脚本。该脚本应获取每个服务器硬盘驱动器的 SMART 状态,并(通过我的内部 SMTP 服务器)向我发送适当的电子邮件。某些服务器可能包含多个硬盘。
我的初始脚本没问题并且工作正常:
$emailto="admin@example.com"
$emailfrom="$env:COMPUTERNAME@example.com "
$emailserver="smtp.example.com "
$output = Get-WmiObject -query "Select * from Win32_diskdrive" | select Model, Status | out-string
function send-email
{
$EmailSubj = "Disks SMART report on $env:COMPUTERNAME"
$EmailBody = $output
Send-MailMessage -To "$emailto" `
-From "$emailfrom" `
-Subject "$EmailSubj" `
-Body "$EmailBody" `
-smtpServer "$emailserver"
}
send-email
典型的输出是这样的:
Model Status
----- ------
ST2000NC000 OK
ST2000NC000 OK
ST2000NC000 OK
ST2000NC000 OK
问题是只有在 BAD 状态可用时如何避免大量垃圾邮件和电子邮件?我想过滤 Get-WmiObject 结果,以便仅在至少一个 HDD 状态不是 "OK" 时才获取邮件。我不确定,但也应该有 "Degraded" 和 "Pred Fail" 状态。我尝试了不同的 foreach 和 If/Else 组合,但我找不到如何强制 PowerShell 检查 "OK" 字符串的方法状态 属性(以及每个 HDD)以实现我的目标。有人可以帮帮我吗?
如果您丢失了 out-string
,您将可以访问对象属性并能够过滤状态不正常。
但只是一个想法,我宁愿有很多电子邮件,因为那样我会知道脚本是 运行 或者至少一封电子邮件说服务器 1 没有坏扇区等...
$output = Get-WmiObject -query "Select * from Win32_diskdrive" | select Model, Status | where status -ne "OK"
$output = Get-WmiObject -query "Select * from Win32_diskdrive" | select Model, Status
| where-object {$_.Status -ne "OK"} | Out-String
如果状态不等于 "OK",则输出驱动器。这应该考虑任何其他状态选项,包括 "BAD".