Powershell - Test-Connection

Ok, i try add Test-Connection and now the code look likes this:

$html=
@'



HTML TABLE
 
  .alert {{
    background-color: #FB1717 }}
    .statusCom {{
    background-color: #FB1717
    }}
  




SystemNameDeviceIDVolumeNameSize(GB)FreeSpace(GB)Status
{0}


'@

$entryTemplate = '{0}{1}{2}{3}{4}{5}{6}'
$alertEntryTemplate = '{0}{1}{2}{3}{4}{5}{6}'
$statusTemplate = '{0}{1}{2}{3}{4}{5}{6}{7}'
Function Get-ComInfo {   
param(
$computers
)

#Here LOW Space thresold is lessthan 10% of the total size of the Volume
$PercentFree = @{Name="FreeSpace(GB)";Expression={"{0:N1}" -f($_.freespace /1GB)}} 
Get-WmiObject Win32_LogicalDisk -filter "DriveType=3" -computer $computers |
Select SystemName,DeviceID,VolumeName,$PercentFree,@{Name="Size(GB)";Expression={"{0:N1}" -f($_.size/1gb)}},@{name="PercentFree(%)";Expression={int}}

}
$servers = Get-Content U:\Users\xxx\Desktop\servers.txt 

$client = $servers
    if(Test-Connection -ComputerName (Get-Content U:\Users\xxx\Desktop\servers.txt ) -BufferSize 16 -Count 1 -Quiet) {
$entries = $servers | % { Get-ComInfo -computers $_ } | % {

    if ([float]::Parse($_.'FreeSpace(GB)') -le 5) {
        $alertEntryTemplate -f $_.SystemName, $_.DeviceID, $_.VolumeName, $_.'FreeSpace(GB)', $_.'Size(GB)', $_.'PercentFree(%)', $_.'LOW SPACE'
    }

    else {
        $entryTemplate -f $_.SystemName, $_.DeviceID, $_.VolumeName, $_.'FreeSpace(GB)', $_.'Size(GB)', $_.'PercentFree(%)', $_.'LOW SPACE'
    }
}
    }
    else{
        $statusTemplate -f $_.SystemName, $_.DeviceID, $_.VolumeName, $_.'FreeSpace(GB)', $_.'Size(GB)', $_.'PercentFree(%)', $_.'LOW SPACE', $_.'Status'
    }


$html -f ($entries -join ' ') | out-file U:\Users\xxx\Desktop\Drivess.html
$OutputFile = "U:\Users\xxx\Desktop\Drivess.html"
$SMTPServer = "smtp.xxx.com" 
$EmailFrom = "xxxx@xxx.com"
$EmailTo = "xxxx@xxx.com"
$Subject = "$computers PROGRES ;))"  
$body = (Get-Content $OutputFile) 
$SMTPClient = New-Object Net.Mail.SmtpClient($SmtpServer, 25) 
$SMTPClient.EnableSsl = $false
$SMTPClient.Credentials = New-Object System.Net.NetworkCredential("xxx", "xxx");
$MailTextT =  Get-Content  -Path U:\Users\xxx\Desktop\Drivess.html -Raw
$msg = New-object Net.Mail.MailMessage($EmailFrom, $EmailTo, $Subject, $body)
$msg.IsBodyHTML = $true  
$SMTPClient.Send($msg)

In html i add this:

.statusCom {{
    background-color: #FB1717
    }}
`
And:
`
$statusTemplate = '{0}{1}{2}{3}{4}{5}{6}{7}' ` 

And i have more than one computer and one is offline in my servers.txt it i get this error:

` Get-WmiObject : Serwer RPC it is offline. (Expectiob HRESULT: 0x800706BA)
At U:\Users\xxx\Desktop\test.ps1:36 char:1
+ Get-WmiObject Win32_LogicalDisk -filter "DriveType=3" -computer $comp ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [Get-WmiObject], COMException
    + FullyQualifiedErrorId : GetWMICOMException,Microsoft.PowerShell.Commands.GetWmiObjectCommand ` 

If i have one computer and it is offline a get this:


What i do wrong?

You’re running Test-Connection against all of your servers at once. That basically means “if any of these servers are online, run the stuff here”. What you probably want is to put the Test-Connection call inside your ForEach-Object loop, so you ping each computer individually. (Alternatively, you could just let the Get-WmiObject call fail and handle the error, not worrying about Test-Connection first.)

I add this:

ForEach-Object {
$ListComputers = Get-Content "U:\Users\XXX\Desktop\servers.txt" 
    if(Test-Connection -ComputerName $ListComputers -Count 1 ){
      
Function Get-ComInfo {   
param(
$computers
)

#Here LOW Space thresold is lessthan 10% of the total size of the Volume
$PercentFree = @{Name="FreeSpace(GB)";Expression={"{0:N1}" -f($_.freespace /1GB)}} 
Get-WmiObject Win32_LogicalDisk -filter "DriveType=3" -computer $computers|
Select SystemName,DeviceID,VolumeName,$PercentFree,@{Name="Size(GB)";Expression={"{0:N1}" -f($_.size/1gb)}},@{name="PercentFree(%)";Expression={int}}

}

$entries = Get-Content U:\Users\XXX\Desktop\servers.txt | % { Get-ComInfo -computers $_ } | % {

    if ([float]::Parse($_.'FreeSpace(GB)') -le 5) {
        $alertEntryTemplate -f $_.SystemName, $_.DeviceID, $_.VolumeName, $_.'FreeSpace(GB)', $_.'Size(GB)', $_.'PercentFree(%)', $_.'LOW SPACE'
    }

    else {
        $entryTemplate -f $_.SystemName, $_.DeviceID, $_.VolumeName, $_.'FreeSpace(GB)', $_.'Size(GB)', $_.'PercentFree(%)', $_.'LOW SPACE'
    }
    }
    }}if(!(test-connection -computername $ListComputers -quiet -count 1)){
        $entryTemplate -f $_.SystemName, $_.DeviceID, $_.VolumeName, $_.'FreeSpace(GB)', $_.'Size(GB)', $_.'PercentFree(%)', $_.'LOW SPACE'
    }
    }

And i get this error:

Get-WmiObject :server is unavailable. (Exception from HRESULT: 0x800706BA)
At U:\Users\XXX\Desktop\test.ps1:40 char:1
+ Get-WmiObject Win32_LogicalDisk -filter "DriveType=3" -computer $comp ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [Get-WmiObject], COMException
    + FullyQualifiedErrorId : GetWMICOMException,Microsoft.PowerShell.Commands.GetWmiObjectCommand

Is Foreach -Object is well, Because there is not credited me to do a report of computers that are unavailable.