Search code examples
powershellwmi

Get PrimaryStatus of DCIM_PhysicalDiskView and Put it in a variable in Powershell


I am trying to use the primaryStatus from the DCIM_PhysicalDiskView and compare it to 3 (degraded hard disk). If there is a match, an email will be sent to notify the admin. Here is the code:

$computerNames = Get-Content -Path C:\scripts\nameTest.txt

foreach ($computer in $computerNames) {

write-host "$computer" 
$value = "3"
$smtpserver = "mailserver.xxxx.com" # your mail server here
$smtpFrom = "[email protected]" # your from address, mail server will most likely allow any
$smtpTo = "[email protected]" #your email address here. can also be an array and will send to all
$MessageSubject = "Testing Failed Disk in $computer" #whatever you want the subject to be. 


gwmi -Namespace root\dcim\sysman -computername $computer -Class DCIM_PhysicalDiskView | ForEach {$name = $_.Name; $primaryStatus = $_.PimaryStatus}
    if( $primaryStatus -contains $value )
    {
        Send-MailMessage -SmtpServer $smtpserver -from $smtpFrom -to $smtpto -subject $messageSubject
        Write-Host "error message sent"
    }
}

My problem is that the command is not piping to the foreach. The $name and $primaryStatus are staying null, therefore not going through the if statement.

Any help on this will be greatly appreciated. Thanks!


Solution

  • The below is your code with the braces changed for the foreach loop. Note that you will still need to have the closing brace from your opening foreach-object.

    gwmi -Namespace root\dcim\sysman -computername $computer -Class DCIM_PhysicalDiskView | ForEach-Object {
        $name = $_.Name
        $primaryStatus = $_.PrimaryStatus
        if( $primaryStatus -eq $value )
        {
            Send-MailMessage -SmtpServer $smtpserver -from $smtpFrom -to $smtpto -subject $messageSubject
            Write-Host "error message sent"
        }
    }
    

    Fixed the typo for $_.PrimaryStatus as well. Is $primaryStatus an array? -Contains only works with arrays. I think you wanted -eq? I dont have access to that namespace so i cannot test my theory. Also, I think that you could change this a little with a Where-Object.

    gwmi -Namespace root\dcim\sysman -computername $computer -Class DCIM_PhysicalDiskView | 
        Where-Object { $primaryStatus -eq $value } | ForEach-Object{
            Send-MailMessage -SmtpServer $smtpserver -from $smtpFrom -to $smtpto -subject $messageSubject
            Write-Host "error message sent"
        }
    

    disclaimer: I do not have that namespace so I cannot test this but the logic looks sounds so it should work.