Public/Get-ServerUptime.ps1
function Get-ServerHealth { param ( [string[]]$servers, $service1 = @("test"), $Threads = 50, [System.Management.Automation.PSCredential] $Credential ) begin { $scriptBlock = { param () #Region Executin Block $ret = (get-date) - (Get-CimInstance Win32_OperatingSystem).LastBootUpTime $hostname = hostname # save status $day = $ret.Days $uptimeStatus = "Server is up for $day Days" $ping = $true; #build object to return $properties = @{'ComputerName' = $hostname; 'Uptime' = $uptimeStatus; 'Ping' = $ping; } #endregion $avObj = New-Object -TypeName PSObject –Prop $properties $avobj } } process{ # clear any existing jobs get-job | stop-job get-job | remove-job $bad = @() $jobname = "ServerHealthCheck" $count = 0 $total = $servers.count $servers | ForEach-Object { $count++ Write-Progress -Activity "scanning for Server Connectivity" -Status "$_ $count of $total" -PercentComplete ($count / $total * 100) if (Test-Connection -Quiet -Count 1 -ComputerName $_) { if($Credential) { Invoke-Command -AsJob -ThrottleLimit 100 -jobname $jobname -computername $_ -Credential $Credential -ScriptBlock $scriptBlock } else { Invoke-Command -AsJob -ThrottleLimit 100 -jobname $jobname -computername $_ -ScriptBlock $scriptBlock } } else { #Write-Host "$_" -ForegroundColor Yellow $bad += $_ } while ((Get-Job -state running | where-object{ $_.Name -eq $jobname }).count -gt $threads) { Start-Sleep -Seconds 5 #"waiting for threads..." } } while ((Get-Job -state running | where-object { $_.Name -eq $jobname }).count -gt 0) { Start-Sleep -Seconds 5 Get-Job -state running | where-object { $_.Name -eq $jobname } } $results = @() get-job -State Completed | where-object { $_.name -eq $jobname } | Receive-Job -keep | foreach-object { $results += $_ } #Write-host $results -ForegroundColor Yellow #add bad servers $bad | foreach-object { #build object to return $properties = @{'ComputerName' = $_; 'Uptime' = "N/A"; 'Ping' = $false; } $avObj = New-Object -TypeName PSObject –Prop $properties $results += $avobj } $results } } <# $env:result = "$pwd\report\Server_Zone_$($zone).csv" $servers = Get-GridPMachine -Zone $zone -ExcludeType ChassisManager | Select-Object -ExpandProperty Name $v=Get-ServerHealth $servers -Credential $cred_ada $v | ? computername -ne $null | select computername,uptime,ping | Export-Csv -NoTypeInformation $env:result -Force Send-Result -FileToSend $env:result -SubjectTitle "Server UptimeCheck - for Zone: $($zone)" Remove-Item -Path $env:result -Force #> |