从Invok-Command返回的无关数据。

问题描述 投票:2回答:4

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

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

我错过了什么?

EDIT:

为了找出问题所在,这是一个简化的,但仍然是错误的脚本。

$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
                       }
                   ]
}
json powershell remote-server invoke-command
4个回答
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
投票

你需要使用 Select-Object 来限制结果,使其只显示在JSON输出中的属性。

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

要想知道更详细的答案,你需要进入到... 遥远的 关于你的 "各种查找和计算 "以及实际转换为JSON的更多细节。


0
投票

这个帖子真的很老了,但6年后我无法找到一个可以接受的答案,所以我自己写了一个。

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

-1
投票

你可以试试这个......不要试图排除不相干的属性值,只要具体地 "调用 "或 "抓取 "你想要的属性值。

快速代码快捷键提示! 另外, Invoke-Command -Computer $server -Scriptbock {command} 可以大大简化使用。icm $server {command}

现在,回到正轨...

使用你最初的postexample,似乎你正试图通过排除所有其他值来利用一个 "值",即-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

本质上,你是在 "挑选 "你所需要的值(与排除属性值相比,当它不工作时,这又是非常令人沮丧的)。


相关示例如下。

下面是一个典型的系统PowershellWMIC命令调用。

icm ServerNameGoesHere {Get-CimInstance -ClassName win32_operatingsystem}

但如果我只想从对象glob中得到 "版本 "呢?

(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

© www.soinside.com 2019 - 2024. All rights reserved.