Utilize results from a Synced Hash table

Welcome Forums General PowerShell Q&A Utilize results from a Synced Hash table

This topic contains 1 reply, has 1 voice, and was last updated by

4 years, 5 months ago.

  • Author
  • #19182

    Points: 0
    Rank: Member

    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.


    I've found the answer here;
    Sharing Variables and Live Objects Between PowerShell Runspaces

    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,...
    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-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 {
        Do {
            $more = $false         
            Foreach($runspace in $runspaces) {
                If ($runspace.Runspace.isCompleted) {
                    $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)
            Write-Host ("Remaining Runspace Jobs: {0}" -f ((@($runspaces | Where {$_.Runspace -ne $Null}).Count)))             
        } while ($more -AND $PSBoundParameters['Wait'])
    #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)
    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
    Get-RunspaceData -Wait 
    $stoptimer = Get-Date 
    #Display info, and display in GridView
    Write-Host "Availability check complete!" -ForegroundColor Cyan
    "Execution Time: {0} Minutes" -f [math]::round(($stoptimer - $starttimer).TotalMinutes , 2)
    $hash | ogv
  • #19204

    Points: 0
    Rank: Member


    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?

The topic ‘Utilize results from a Synced Hash table’ is closed to new replies.

denizli escort samsun escort muğla escort ataşehir escort kuşadası escort