2014-03-13 14 views
2

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

我试过管道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 
         } 
        ] 
} 

回答

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 
+0

我要么不正确集成该解决方案,或者它不适用于这类问题。 我已更新问题以反映此问题。 – DiscOH

+0

不是你。我认为这是因为这些是反序列化的对象,而且它们不像预期的那样行事。 – mjolinor

2

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

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

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

-1

你可以试试这个...而不是试图排除多余的属性值,只是具体的“呼叫”或“抢”一个你想要的(一个或多个)。

快速代码快捷方式提示!顺便说一句,在Invoke-Command -Computer $server -Scriptbock {command}可以大大简化使用:icm $server {command}

现在,回到正轨......

使用你原来的职位/例如,看来你正试图通过排除所有利用一个“值”其他值,即-ExcludeProperty(这是非常令人沮丧的)。

首先让我们来拆卸和更换唯一的排部:

select -ExcludeProperty PSComputerName,RunSpaceID,PSShowComputerName 

,而是,尝试使用以下之一:

第1种方法:使用修改后的原始命令

$returnedServer.$server += ,(Invoke-Command -ComputerName $server -ScriptBlock {1}-credential $mycred).value 

第2种方法:使用 “ICM” 版本...

$returnedServer.$server += ,(icm $server {1} -credential $mycred).value 

基本上,你是“挑选出”你需要的价值(对比)。不包括财产价值,当它不起作用时,这又是相当令人沮丧的)。


相关的例子(S)如下:

这里是一个典型的系统Powershell的/ WMIC命令调用:

icm ServerNameGoesHere {Get-CimInstance -ClassName win32_operatingsystem} 

但如果我只希望从对象水珠 “版本” :

(icm ServerNameGoesHere {Get-CimInstance -ClassName win32_operatingsystem}).version 

但是,坚持住,现在我只希望从对象水珠的 “lastbootuptime”:

(icm ServerNameGoesHere {Get-CimInstance -ClassName win32_operatingsystem}).lastbootuptime 

犹豫不决,我想更灵活:

$a=icm ServerNameGoesHere {Get-CimInstance -ClassName win32_operatingsystem} 
$a.version 
$a.lastbootuptime 
$a.csname 

(?有道理)

祝你好运, 〜PhilC