2

我正在使用 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
                       }
                   ]
}
4

4 回答 4

2

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

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

要获得更全面的答案,您需要详细地了解“各种查找和计算”以及到 JSON 的实际转换。

于 2014-03-13T20:27:09.070 回答
2

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

$invokeCommandResults | ForEach-Object {
  $_.PSObject.Properties.Remove('PSComputerName')
  $_.PSObject.Properties.Remove('RunspaceId')
  $_.PSObject.Properties.Remove('PSShowComputerName')
}
于 2020-05-16T17:08:07.267 回答
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
于 2014-03-13T20:31:46.097 回答
-1

你可以试试这个......而不是试图排除无关的属性值,只是具体并“调用”或“抓住”你想要的。

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

现在,回到正轨...

使用您的原始帖子/示例,您似乎正试图通过排除所有其他值来利用一个“值”,即 -ExcludeProperty (这非常令人沮丧)。

让我们从删除和替换唯一的排除部分开始:

select -ExcludeProperty PSComputerName,RunSpaceID,PSShowComputerName

相反,尝试使用以下方法之一:

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

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

第二种方法:使用“icm”版本...

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

从本质上讲,您正在“挑选”您需要的值(相对于排除属性值,当它不起作用时,这再次令人沮丧)。


相关示例如下:

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

icm ServerNameGoesHere {Get-CimInstance -ClassName win32_operatingsystem}

但是,如果我只想要对象 glob 中的“版本”怎么办:

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

但是,等一下,现在我只想要对象 glob 中的“lastbootuptime”:

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

犹豫不决,我想更灵活:

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

(说得通?)

祝你好运,~PhilC

于 2015-04-22T05:26:23.050 回答