2014-03-13 16 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