This powershell script with built-in GUI allows you to point to a text file list of computers and will then retrieve the following information for each computer in the list.

Run it by entering  .\'Display Computers Status And info with GUI.ps1' or use the compiled executalbe file Display Computers Status and info with Gui.exe included in the zip file download to run without having to launch powershell.
Change c:\computers.txt to point to your text file containing the computers you are scanning one name per line.
The refresh rate can be set by the user to any interval or you can force a rescan at any time by clicking the Get Status Button. 

To copy the output to an excel spreadsheet select the cells you want to copy and CTRL-C then open excel and CTRL-V

If you get an error when copying using the ps1 script in powershell 1 or 2, make sure to start powershell  with the -sta switch.

 

 

   

 

PowerShell
Edit|Remove
Param ([switch]$NoWarning,[switch]$Debug) 
 
If ($Debug) { 
    #enable debug messages if -debug is specified 
    $debugPreference="Continue" 
} 
 
If ($NoWarning) { 
    #turn off warning messages 
    $WarningPreference="SilentlyContinue" 
} 
 
function Ping-Host { 
  Param([string]$computername=$(Throw "You must specify a computername.")) 
   
  Write-Debug "In Ping-Host function" 
   
  $query="Select * from Win32_PingStatus where address='$computername'" 
   
  $wmi=Get-WmiObject -query $query 
  write $wmi 
} 
 
function Get-OS { 
  Param([string]$computername=$(Throw "You must specify a computername.")) 
  Write-Debug "In Get-OS Function" 
  $wmi=Get-WmiObject Win32_OperatingSystem -computername $computername -ea stop 
   
  write $wmi 
 
} 
 
 
#Generated Form Function 
function GenerateForm { 
 
#region Import the Assemblies 
Write-Debug "Loading Assemblies" 
[reflection.assembly]::loadwithpartialname("System.Drawing"| Out-Null 
[reflection.assembly]::loadwithpartialname("System.Windows.Forms"| Out-Null 
#endregion 
 
#region Generated Form Objects 
Write-Debug "Creating form objects" 
$form1 = New-Object System.Windows.Forms.Form 
$lblRefreshInterval = New-Object System.Windows.Forms.Label 
$numInterval = New-Object System.Windows.Forms.NumericUpDown 
$btnQuit = New-Object System.Windows.Forms.Button 
$btnGo = New-Object System.Windows.Forms.Button 
$dataGridView = New-Object System.Windows.Forms.DataGridView 
$label2 = New-Object System.Windows.Forms.Label 
$statusBar = New-Object System.Windows.Forms.StatusBar 
$txtComputerList = New-Object System.Windows.Forms.TextBox 
$timer1 = New-Object System.Windows.Forms.Timer 
#endregion Generated Form Objects 
 
#---------------------------------------------- 
#Generated Event Script Blocks 
#---------------------------------------------- 
 
$LaunchCompMgmt=  
{ 
    #only launch computer management if a cell in the Computername  
    #column was selected. 
    $c=$dataGridView.CurrentCell.columnindex 
    $colHeader=$dataGridView.columns[$c].name 
    if ($colHeader -eq "Computername") { 
        $computer=$dataGridView.CurrentCell.Value 
        Write-Debug ("Launch computer management for {0}" -$computer.toUpper()) 
        compmgmt.msc /computer:$computer 
    } 
} #end Launch Computer Management script block 
 
$GetStatus=  
{ 
 
 Trap { 
        Write-Debug "Error trapped in GetStatus script block" 
        Write-Warning $_.Exception.message 
        Continue 
    } 
     
    #stop the timer while data is refreshed 
    Write-Debug "Stop the timer" 
    $timer1.stop() 
 
    Write-Debug ("Getting content from {0}" -$txtComputerlist.Text) 
    if ($computers) {Clear-Variable computers} 
     
    #clear the table 
    $dataGridView.DataSource=$Null 
     
    $computers=Get-Content $txtComputerList.Text -ea stop | sort  
     
    if ($computers) { 
        
        $statusBar.Text = ("Querying computers from {0}" -$txtComputerList.Text) 
        $form1.Refresh 
         
        #create an array for griddata 
        Write-Debug "Create `$griddata" 
        $griddata=@() 
        #create a custom object 
         
        foreach ($computer in $computers) { 
          Write-Debug "Pinging $computer" 
          $statusBar.Text=("Pinging {0}" -$computer.toUpper()) 
          Write-Debug "Creating `$obj" 
          $obj=New-Object PSobject 
          Write-Debug "Adding Computername property" 
          $obj | Add-Member Noteproperty Computername $computer.ToUpper() 
           
          #ping the computer 
          if ($pingResult) { 
            #clear PingResult if it has a left over value 
            Clear-Variable pingResult 
            } 
          $pingResult=Ping-Host $computer 
          Write-Debug "Pinged status code is $($pingResult.Statuscode)" 
       
          if ($pingResult.StatusCode -eq 0) { 
                
               $obj | Add-Member Noteproperty Pinged "Yes" 
               Write-Debug "Adding $($pingresult.ProtocolAddress)" 
               $obj | Add-Member Noteproperty IP $pingResult.ProtocolAddress 
                
               #get remaining information via WMI 
               Trap { 
                #define a trap to handle any WMI errors 
                Write-Warning ("There was a problem with {0}" -$computer.toUpper()) 
                Write-Warning $_.Exception.GetType().FullName 
                Write-Warning $_.Exception.message 
                Continue 
                } 
                        
                if ($os) { 
                    #clear OS if it has a left over value 
                    Clear-Variable os 
                } 
               $os=Get-OS $computer 
               if ($os) { 
                   $lastboot=$os.ConvertToDateTime($os.lastbootuptime) 
                   Write-Debug "Adding $lastboot" 
                   $uptime=((get-date- ($os.ConvertToDateTime($os.lastbootuptime))).tostring() 
                   Write-Debug "Adding $uptime" 
                   $osname=$os.Caption 
                   Write-Debug "Adding $osname" 
                   $servicepack=$os.CSDVersion 
                   Write-Debug "Adding $servicepack" 
                    
                   $obj | Add-Member Noteproperty OS $osname 
                   $obj | Add-Member Noteproperty ServicePack $servicepack 
                   $obj | Add-Member Noteproperty Uptime $uptime 
                   $obj | Add-Member Noteproperty LastBoot $lastboot 
               } 
               else { 
               Write-Debug "Setting properties to N/A" 
                   $obj | Add-Member Noteproperty OS "N/A" 
                   $obj | Add-Member Noteproperty ServicePack "N/A" 
                   $obj | Add-Member Noteproperty Uptime "N/A" 
                   $obj | Add-Member Noteproperty LastBoot "N/A" 
               } 
          } 
          else { 
                Write-Debug "Ping failed" 
                Write-Debug "Setting properties to N/A" 
 
               $obj | Add-Member Noteproperty Pinged "No" 
               $obj | Add-Member Noteproperty IP "N/A" 
               $obj | Add-Member Noteproperty OS "N/A" 
               $obj | Add-Member Noteproperty ServicePack "N/A" 
               $obj | Add-Member Noteproperty Uptime "N/A" 
               $obj | Add-Member Noteproperty LastBoot "N/A" 
          } 
         
            #Add the object to griddata 
                Write-Debug "Adding `$obj to `$griddata" 
                $griddata+=$obj 
 
         
        } #end foreach 
         
        Write-Debug "Creating ArrayList"    
        $arrayNew-Object System.Collections.ArrayList 
         
        Write-Debug "Adding `$griddata to `$arry" 
        $array.AddRange($griddata) 
        $DataGridView.DataSource = $array 
        #find unpingable computer rows 
        Write-Debug "Searching for non-pingable computers" 
        $c=$dataGridView.RowCount 
        for ($x=0;$x -lt $c;$x++) { 
            for ($y=0;$y -lt $dataGridView.Rows[$x].Cells.Count;$y++) { 
                $value = $dataGridView.Rows[$x].Cells[$y].Value 
                if ($value -eq "No") { 
                #if Pinged cell = No change the row font color 
                Write-Debug "Changing color on row $x" 
                $dataGridView.rows[$x].DefaultCellStyle.Forecolor=[System.Drawing.Color]::FromArgb(255,255,0,0) 
                } 
            } 
        } 
        Write-Debug "Setting status bar text" 
        $statusBar.Text=("Ready. Last updated {0}" -f (Get-Date)) 
 
    } 
    else { 
        Write-Debug "Setting status bar text" 
        $statusBar.Text=("Failed to find {0}" -$txtComputerList.text) 
    } 
    
   #set the timer interval 
    $interval=$numInterval.value -as [int] 
    Write-Debug "Interval is $interval" 
    #interval must be in milliseconds 
    $timer1.Interval = ($interval * 60000) #1 minute time interval 
    Write-Debug ("Timer interval calculated at {0} milliseconds" -$timer1.Interval ) 
    #start the timer 
    Write-Debug "Starting timer" 
    $timer1.Start() 
     
    Write-Debug "Refresh form" 
    $form1.Refresh() 
    
} #End GetStatus scriptblock 
 
$Quit=  
{ 
    Write-Debug "closing the form" 
    $form1.Close() 
} #End Quit scriptblock 
 
#---------------------------------------------- 
#region Generated Form Code 
$form1.Name = 'form1' 
$form1.Text = 'Display Computer Status' 
$form1.DataBindings.DefaultDataSourceUpdateMode = 0 
$System_Drawing_Size = New-Object System.Drawing.Size 
$System_Drawing_Size.Width = 890 
$System_Drawing_Size.Height = 359 
$form1.ClientSize = $System_Drawing_Size 
$form1.StartPosition = 1 
$form1.BackColor = [System.Drawing.Color]::FromArgb(255,185,209,234) 
 
$lblRefreshInterval.Text = 'Refresh Interval (min)' 
 
$lblRefreshInterval.DataBindings.DefaultDataSourceUpdateMode = 0 
$lblRefreshInterval.TabIndex = 10 
$lblRefreshInterval.TextAlign = 64 
#$lblRefreshInterval.Anchor = 9 
$lblRefreshInterval.Name = 'lblRefreshInterval' 
$System_Drawing_Size = New-Object System.Drawing.Size 
$System_Drawing_Size.Width = 128 
$System_Drawing_Size.Height = 23 
$lblRefreshInterval.Size = $System_Drawing_Size 
$System_Drawing_Point = New-Object System.Drawing.Point 
$System_Drawing_Point.X = 440 
$System_Drawing_Point.Y = 28 
$lblRefreshInterval.Location = $System_Drawing_Point 
 
$form1.Controls.Add($lblRefreshInterval) 
 
#$numInterval.Anchor = 9 
$numInterval.DataBindings.DefaultDataSourceUpdateMode = 0 
$numInterval.Name = 'numInterval' 
$numInterval.Value = 10 
$numInterval.TabIndex = 9 
$System_Drawing_Size = New-Object System.Drawing.Size 
$System_Drawing_Size.Width = 51 
$System_Drawing_Size.Height = 20 
$numInterval.Size = $System_Drawing_Size 
$numInterval.Maximum = 60 
$numInterval.Minimum = 1 
$numInterval.Increment = 2 
$System_Drawing_Point = New-Object System.Drawing.Point 
$System_Drawing_Point.X = 575 
$System_Drawing_Point.Y = 30 
$numInterval.Location = $System_Drawing_Point 
# $numInterval.add_ValueChanged($GetStatus) 
 
$form1.Controls.Add($numInterval) 
 
 
$btnQuit.UseVisualStyleBackColor = $True 
$btnQuit.Text = 'Close' 
 
$btnQuit.DataBindings.DefaultDataSourceUpdateMode = 0 
$btnQuit.TabIndex = 2 
$btnQuit.Name = 'btnQuit' 
$System_Drawing_Size = New-Object System.Drawing.Size 
$System_Drawing_Size.Width = 75 
$System_Drawing_Size.Height = 23 
$btnQuit.Size = $System_Drawing_Size 
#$btnQuit.Anchor = 9 
$System_Drawing_Point = New-Object System.Drawing.Point 
$System_Drawing_Point.X = 341 
$System_Drawing_Point.Y = 30 
$btnQuit.Location = $System_Drawing_Point 
$btnQuit.add_Click($Quit) 
 
$form1.Controls.Add($btnQuit) 
 
 
$btnGo.UseVisualStyleBackColor = $True 
$btnGo.Text = 'Get Status' 
 
$btnGo.DataBindings.DefaultDataSourceUpdateMode = 0 
$btnGo.TabIndex = 1 
$btnGo.Name = 'btnGo' 
$System_Drawing_Size = New-Object System.Drawing.Size 
$System_Drawing_Size.Width = 75 
$System_Drawing_Size.Height = 23 
$btnGo.Size = $System_Drawing_Size 
#$btnGo.Anchor = 9 
$System_Drawing_Point = New-Object System.Drawing.Point 
$System_Drawing_Point.X = 233 
$System_Drawing_Point.Y = 31 
$btnGo.Location = $System_Drawing_Point 
$btnGo.add_Click($GetStatus) 
 
$form1.Controls.Add($btnGo) 
 
$dataGridView.RowTemplate.DefaultCellStyle.ForeColor = [System.Drawing.Color]::FromArgb(255,0,128,0) 
$dataGridView.Name = 'dataGridView' 
$dataGridView.DataBindings.DefaultDataSourceUpdateMode = 0 
$dataGridView.ReadOnly = $True 
$dataGridView.AllowUserToDeleteRows = $False 
$dataGridView.RowHeadersVisible = $False 
$System_Drawing_Size = New-Object System.Drawing.Size 
$System_Drawing_Size.Width = 870 
$System_Drawing_Size.Height = 260 
$dataGridView.Size = $System_Drawing_Size 
$dataGridView.TabIndex = 8 
$dataGridView.Anchor = 15 
$dataGridView.AutoSizeColumnsMode = 16 
 
 
 
$dataGridView.AllowUserToAddRows = $False 
$dataGridView.ColumnHeadersHeightSizeMode = 2 
$System_Drawing_Point = New-Object System.Drawing.Point 
$System_Drawing_Point.X = 13 
$System_Drawing_Point.Y = 70 
$dataGridView.Location = $System_Drawing_Point 
$dataGridView.AllowUserToOrderColumns = $True 
$dataGridView.add_CellContentDoubleClick($LaunchCompMgmt#$dataGridView.AutoResizeColumns([System.Windows.Forms.DataGridViewAutoSizeColumnsMode.AllCells]::AllCells) 
#$DataGridViewAutoSizeColumnsMode.AllCells 
 
$form1.Controls.Add($dataGridView) 
 
$label2.Text = 'Enter the name and path of a text file with your list of computer names: (One name per line)' 
 
$label2.DataBindings.DefaultDataSourceUpdateMode = 0 
$label2.TabIndex = 7 
$label2.Name = 'label2' 
$System_Drawing_Size = New-Object System.Drawing.Size 
$System_Drawing_Size.Width = 490 
$System_Drawing_Size.Height = 23 
$label2.Size = $System_Drawing_Size 
$System_Drawing_Point = New-Object System.Drawing.Point 
$System_Drawing_Point.X = 12 
$System_Drawing_Point.Y = 7 
$label2.Location = $System_Drawing_Point 
 
$form1.Controls.Add($label2) 
 
$statusBar.Name = 'statusBar' 
$statusBar.DataBindings.DefaultDataSourceUpdateMode = 0 
$statusBar.TabIndex = 4 
$System_Drawing_Size = New-Object System.Drawing.Size 
$System_Drawing_Size.Width = 428 
$System_Drawing_Size.Height = 22 
$statusBar.Size = $System_Drawing_Size 
$System_Drawing_Point = New-Object System.Drawing.Point 
$System_Drawing_Point.X = 0 
$System_Drawing_Point.Y = 337 
$statusBar.Location = $System_Drawing_Point 
$statusBar.Text = 'Ready' 
 
$form1.Controls.Add($statusBar) 
 
$txtComputerList.Text = 'c:\computers.txt' 
$txtComputerList.Name = 'txtComputerList' 
$txtComputerList.TabIndex = 0 
$System_Drawing_Size = New-Object System.Drawing.Size 
$System_Drawing_Size.Width = 198 
$System_Drawing_Size.Height = 20 
$txtComputerList.Size = $System_Drawing_Size 
$System_Drawing_Point = New-Object System.Drawing.Point 
$System_Drawing_Point.X = 13 
$System_Drawing_Point.Y = 33 
$txtComputerList.Location = $System_Drawing_Point 
$txtComputerList.DataBindings.DefaultDataSourceUpdateMode = 0 
 
$form1.Controls.Add($txtComputerList) 
 
 
#endregion Generated Form Code 
 
Write-Debug "Adding script block to timer" 
#add the script block to execute when the timer interval expires 
$timer1.add_Tick($GetStatus) 
 
#Show the Form 
Write-Debug "ShowDialog()" 
$form1.ShowDialog()| Out-Null 
 
} #End Function 
 
#Call the Function 
Write-Debug "Call GenerateForm" 
GenerateForm 
 

 

 Click the Download link at the top of this page to get this script