function Get-FreeDiskSpace {
    param (
        [array]$Computers
    )
    $sblock = {
        #Write-Progress -Activity "Retrieving data from online computers" -Status $Env:COMPUTERNAME -PercentComplete 80
        try {$win32_LogicalDisk = Get-CimInstance -ClassName Win32_LogicalDisk -Filter "DriveType=3" } catch {$win32_LogicalDisk = $null} #| Diskspace
        $CompFreeSpace = @([math]::Round($win32_LogicalDisk.FreeSpace / 1gb,2),[math]::Round($win32_LogicalDisk.Size / 1gb,2))
        $free = $compFreeSpace[0]
        $max = $compfreeSpace[1]

        $obj = New-Object -TypeName PSObject 

        $obj | Add-Member -MemberType NoteProperty -Name 'Hostname' -Value $Env:COMPUTERNAME
        $obj | Add-Member -MemberType NoteProperty -Name 'Free Space' -Value $free
        $obj | Add-Member -MemberType NoteProperty -Name 'Total Space' -Value $max

        return $obj
    }
    $data = @()
    $OnlineComputers = @()
    $OfflineComputers = @()
    $itemIndex = 0
    foreach($comp in $Computers){
        $itemIndex++
        Write-Progress -Activity "Connecting to Computers" -Status $Env:COMPUTERNAME -PercentComplete ($itemIndex / $Computers.Count)*100
        $Connection = Test-Connection -ComputerName $comp -Count 1
        if($Connection){
            $OnlineComputers += $comp
        }
        else{
            $OfflineComputers += $comp
        }
    }

    $data += Invoke-Command -ScriptBlock $sblock -ComputerName $OnlineComputers -SessionOption (New-PSSessionOption -NoMachineProfile -OpenTimeout 45000) | Select-Object * -ExcludeProperty RunspaceId, PSComputerName, PSShowComputerName
    
    foreach($comp in $OfflineComputers){
        $obj = New-Object -TypeName PSObject 
        $obj | Add-Member -MemberType NoteProperty -Name 'Hostname' -Value $comp
        $obj | Add-Member -MemberType NoteProperty -Name 'Free Space' -Value 'OFFLINE'
        $obj | Add-Member -MemberType NoteProperty -Name 'Total Space' -Value 'OFFLINE'
        $data += $obj

    }
    return $data
}