从Invoke-Command返回的无关数据

时间:2014-03-13 19:33:58

标签: json powershell remote-server invoke-command

我正在使用PowerShell从远程服务器列表中收集数据,然后将其转换为JSON对象。一切都运转良好,但我得到了一些我似乎无法排除的非常奇怪的输出。

我已尝试管道Invoke-Command结果并排除属性。我还尝试从返回的哈希文件中手动删除项目,但我似乎无法让它们消失。

我错过了什么?

编辑:

为了弄清楚这里的错误是一个简化但仍然破碎的脚本:

$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

哪个输出:

{
"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
                       }
                   ]
}

3 个答案:

答案 0 :(得分:2)

您需要使用Select-Object将结果限制为您希望在JSON输出中显示的属性:

$returnedServers.$server += ,(Invoke-Command -ComputerName $server -ScriptBlock 
{
...$serverHash = various look ups and calculations...
$serverHash
} | select PropertyA, PropertyB, ...)

要获得更全面的答案,您需要深入了解 far 有关“各种查找和计算”以及实际转换为JSON的详细信息。

答案 1 :(得分:1)

经过一些测试,似乎问题是对象类型。通过显式地转换返回的结果,我能够让你的测试脚本工作。

$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

答案 2 :(得分:0)

这篇文章真的很老,但是6年后我找不到一个可接受的答案,所以我写了自己的答案。

$invokeCommandResults | ForEach-Object {
  $_.PSObject.Properties.Remove('PSComputerName')
  $_.PSObject.Properties.Remove('RunspaceId')
  $_.PSObject.Properties.Remove('PSShowComputerName')
}