Search code examples
jsonpowershellremote-serverinvoke-command

Extraneous data returned from Invoke-Command


I'm working with PowerShell to gather data from a list of remote servers which I then turn into a JSON object. Everything is working fine, but I get some really weird output that I can't seem to exclude.

I've tried piping the Invoke-Command results and excluding properties. I've also tried removing the items manually from the returned hash file, but I can't seem to make them go away.

What am I missing?

EDIT:

For the sake of figuring out what's wrong here is a simplified, but still broken, script:

$returnedServer = @{}
$pass = cat "C:\...\securestring.txt" | convertto-securestring
$mycred = new-object -typename System.Management.Automation.PSCredential -argumentlist "UserName",$pass
$s = @("xx.xxx.xxx.xxx","xx.xxx.xxx.xxx") 


foreach($server in $s)
{
    $returnedServer.$server += ,(Invoke-Command -ComputerName $server -ScriptBlock 
{
1
}-credential $mycred | select -ExcludeProperty PSComputerName,RunSpaceID,PSShowComputerName) 

$returnedServer| ConvertTo-Json

Which outputs:

{
"xx.xxx.xxx.xxx":  [
                       {
                           "value":  1,
                           "PSComputerName":  "xx.xxx.xxx.xxx",
                           "RunspaceId":  "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
                           "PSShowComputerName":  xxxx
                       }
                   ],
"xx.xxx.xxx.xxx":  [
                       {
                           "value":  1,
                           "PSComputerName":  "xx.xxx.xxx.xxx",
                           "RunspaceId":  "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"",
                           "PSShowComputerName":  xxxx
                       }
                   ]
}

Solution

  • After some testing, it seems the problem is the object type. I was able to get your test script to work by explicitly casting the returned result.

    $returnedServer = @{}
    $pass = cat "C:\...\securestring.txt" | convertto-securestring
    $mycred = new-object -typename System.Management.Automation.PSCredential -argumentlist "UserName",$pass
    $s = @("xx.xxx.xxx.xxx","xx.xxx.xxx.xxx") 
    
    
    
    
    foreach($server in $s)
    {
      $returnedServer.$server += ,[int](Invoke-Command -ComputerName $server -ScriptBlock {1} -credential $mycred) 
    }
    $returnedServer| ConvertTo-Json