我正在使用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
}
]
}
经过一些测试,似乎问题出在对象类型上。 我可以通过显式铸造返回的结果来让你的测试脚本工作。
$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
你需要使用 Select-Object
来限制结果,使其只显示在JSON输出中的属性。
$returnedServers.$server += ,(Invoke-Command -ComputerName $server -ScriptBlock
{
...$serverHash = various look ups and calculations...
$serverHash
} | select PropertyA, PropertyB, ...)
要想知道更详细的答案,你需要进入到... 遥远的 关于你的 "各种查找和计算 "以及实际转换为JSON的更多细节。
这个帖子真的很老了,但6年后我无法找到一个可以接受的答案,所以我自己写了一个。
$invokeCommandResults | ForEach-Object {
$_.PSObject.Properties.Remove('PSComputerName')
$_.PSObject.Properties.Remove('RunspaceId')
$_.PSObject.Properties.Remove('PSShowComputerName')
}
你可以试试这个......不要试图排除不相干的属性值,只要具体地 "调用 "或 "抓取 "你想要的属性值。
快速代码快捷键提示! 另外, 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
$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