Utilize results from a Synced Hash table

This topic contains 1 reply, has 1 voice, and was last updated by Profile photo of chris-crill chris-crill 2 years, 2 months ago.

  • Author
    Posts
  • #19182
    Profile photo of chris-crill
    chris-crill
    Participant

    Hello, I am working on adapting a script provided to me by a friend to handle multiple functions, problem is, his network is only 700 or so computers, so he is using Jobs. My network has roughly 6000 computers, so jobs is crashing my workstation, or taking too long to accomplish. I've moved to Runspace, Tome's ForEach-Parralel function. Issue I'm running into is that the script is built to capture results into an array, where it will use that data for multiple functions.

    UPDATE:

    I've found the answer here;

    Only thing I'm stuck on now is sorting through the returned data, instead of an out grid view with multiple columns to sort and utilize I get a has table that looks like this;

    I would like to be able to get the data into columns so I can use them for various troubleshooting, online machines will get checked for remote capabilities, repair ones that don't have remote capabilites, connect and check IAVM status, etc... Once I get this figured out I'll be adopting it a larger script for all of these functions, some which pull 10+ variables to display as columns. I could export as CSV, import into Excel, Delimit and process the data manually, but I have to hope powershell has a way of streamlinning this.

    Name                           Value                                                                                                                        
    ----                           -----                                                                                                                        
    x-410ZWG                \\x-DHMVV1\root\cimv2:Win32_PingStatus.Address="x-410ZWG",BufferSize=32,NoFragmentation=false,RecordRoute=0,...
    x-47045Q                \\x-DHMVV1\root\cimv2:Win32_PingStatus.Address="x-47045Q",BufferSize=32,NoFragmentation=false,RecordRoute=0,...
    x-440J26                \\x-DHMVV1\root\cimv2:Win32_PingStatus.Address="x-440J26",BufferSize=32,NoFragmentation=false,RecordRoute=0,...
    x-410Y45                \\x-DHMVV1\root\cimv2:Win32_PingStatus.Address="x-410Y45",BufferSize=32,NoFragmentation=false,RecordRoute=0,...
    x-DJKVV1                \\x-DHMVV1\root\cimv2:Win32_PingStatus.Address="x-DJKVV1",BufferSize=32,NoFragmentation=false,RecordRoute=0,...
    nonexistant                                                                                                                                                 
    x-DDMVV1                \\x-DHMVV1\root\cimv2:Win32_PingStatus.Address="x-DDMVV1",BufferSize=32,NoFragmentation=false,RecordRoute=0,...
    x-470481                \\x-DHMVV1\root\cimv2:Win32_PingStatus.Address="x-470481",BufferSize=32,NoFragmentation=false,RecordRoute=0,...
    x-DHKVV1                \\x-DHMVV1\root\cimv2:Win32_PingStatus.Address="x-DHKVV1",BufferSize=32,NoFragmentation=false,RecordRoute=0,...
    x-430XXF                \\x-DHMVV1\root\cimv2:Win32_PingStatus.Address="x-430XXF",BufferSize=32,NoFragmentation=false,RecordRoute=0,...
    x-DLKVV1                \\x-DHMVV1\root\cimv2:Win32_PingStatus.Address="x-DLKVV1",BufferSize=32,NoFragmentation=false,RecordRoute=0,...
    x-410S86                \\x-DHMVV1\root\cimv2:Win32_PingStatus.Address="x-410S86",BufferSize=32,NoFragmentation=false,RecordRoute=0,...
    x-SCH004                \\x-DHMVV1\root\cimv2:Win32_PingStatus.Address="x-SCH004",BufferSize=32,NoFragmentation=false,RecordRoute=0,...
    x-431KMS                                                                                                                                             
    x-440J22                \\x-DHMVV1\root\cimv2:Win32_PingStatus.Address="x-440J22",BufferSize=32,NoFragmentation=false,RecordRoute=0,...
    
    

    Thank for any help!

    Code currently

    Function Get-RunspaceData {
        [cmdletbinding()]
        param(
            [switch]$Wait
        )
        Do {
            $more = $false         
            Foreach($runspace in $runspaces) {
                If ($runspace.Runspace.isCompleted) {
                    $runspace.powershell.EndInvoke($runspace.Runspace)
                    $runspace.powershell.dispose()
                    $runspace.Runspace = $null
                    $runspace.powershell = $null                 
                } ElseIf ($runspace.Runspace -ne $null) {
                    $more = $true
                }
            }
            If ($more -AND $PSBoundParameters['Wait']) {
                Start-Sleep -Milliseconds 100
            }   
            #Clean out unused runspace jobs
            $temphash = $runspaces.clone()
            $temphash | Where {
                $_.runspace -eq $Null
            } | ForEach {
                Write-Verbose ("Removing {0}" -f $_.computer)
                $Runspaces.remove($_)
            }  
            Write-Host ("Remaining Runspace Jobs: {0}" -f ((@($runspaces | Where {$_.Runspace -ne $Null}).Count)))             
        } while ($more -AND $PSBoundParameters['Wait'])
    }
    
    
    #Begin
    #What each runspace will do
    $ScriptBlock = {
        Param ($computer,$hash)
        $Ping = test-connection $computer -count 1 -ea 0
        $hash[$Computer]= $Ping
            }
    
    #Setup the runspace
    $Script:runspaces = New-Object System.Collections.ArrayList   
    # Data table for all of the runspaces
    $hash = [hashtable]::Synchronized(@{})
    $sessionstate = [system.management.automation.runspaces.initialsessionstate]::CreateDefault()
    $runspacepool = [runspacefactory]::CreateRunspacePool(1, 100, $sessionstate, $Host)
    $runspacepool.Open() 
    
    #Process
    ForEach ($Computer in $Computername) {
        #Create the powershell instance and supply the scriptblock with the other parameters 
        $powershell = [powershell]::Create().AddScript($scriptBlock).AddArgument($computer).AddArgument($hash)
               
        #Add the runspace into the powershell instance
        $powershell.RunspacePool = $runspacepool
               
        #Create a temporary collection for each runspace
        $temp = "" | Select-Object PowerShell,Runspace,Computer
        $Temp.Computer = $Computer
        $temp.PowerShell = $powershell
               
        #Save the handle output when calling BeginInvoke() that will be used later to end the runspace
        $temp.Runspace = $powershell.BeginInvoke()
        Write-Verbose ("Adding {0} collection" -f $temp.Computer)
        $runspaces.Add($temp) | Out-Null               
    }
    
    # Wait for all runspaces to finish
    #End
    Get-RunspaceData -Wait 
    $stoptimer = Get-Date 
    #Display info, and display in GridView
    Write-Host
    Write-Host "Availability check complete!" -ForegroundColor Cyan
    "Execution Time: {0} Minutes" -f [math]::round(($stoptimer - $starttimer).TotalMinutes , 2)
    $hash | ogv
    
  • #19204
    Profile photo of chris-crill
    chris-crill
    Participant

    http://gallery.technet.microsoft.com/Retrieve-Remote-Scheduled-72985b8f

    Seems like it may have what I need as well, can anyone prvide insight as to the key procedures being done that allow the capture and retrieval?

You must be logged in to reply to this topic.