【问题标题】:Getting a nested object in powershell with a JSON return使用 JSON 返回在 powershell 中获取嵌套对象
【发布时间】:2019-10-08 02:15:34
【问题描述】:

我目前正在尝试通过 Powershell REST 服务器从 Hyper-V 服务器检索信息。目前,我在 powershell 中设置了一个 HTTP-Listener 来接收命令、运行它并以 JSON 格式返回结果。

如果我发送命令: localhost:8888?command=get-vm -ComputerName ServerName

我得到了一个非常长的机器和参数列表,我真的不需要。

{
    "Id": "cd12132a-424d-4a90-9be2-cc521c5cdf8a",
    "Name": "3Y6S9438",
    "State": 2,
    "IntegrationServicesState": "Up to date",
    "OperationalStatus": [
      2
    ],
    "PrimaryOperationalStatus": 2,
    "SecondaryOperationalStatus": null,
    "StatusDescriptions": [
      "Operating normally"
    ],
    "PrimaryStatusDescription": "Operating normally",
    "SecondaryStatusDescription": null,
    "Status": "Operating normally",
    "Heartbeat": 5,
    "ReplicationState": 0,
    "ReplicationHealth": 0,
    "ReplicationMode": 0,
    "CPUUsage": 0,
    "MemoryAssigned": 2147483648,
    "MemoryDemand": 0,
    "MemoryStatus": "",
    "SmartPagingFileInUse": false,
    "Uptime": {
      "Ticks": 9672280000000,
      "Days": 11,
      "Hours": 4,
      "Milliseconds": 0,
      "Minutes": 40,
      "Seconds": 28,
      "TotalDays": 11.194768518518519,
      "TotalHours": 268.6744444444444,
      "TotalMilliseconds": 967228000,
      "TotalMinutes": 16120.466666666667,
      "TotalSeconds": 967228
    },
    "IntegrationServicesVersion": {
      "Major": 6,
      "Minor": 3,
      "Build": 9600,
      "Revision": 17831,
      "MajorRevision": 0,
      "MinorRevision": 17831
    },
    "ResourceMeteringEnabled": false,
    "ConfigurationLocation": "C:\\ClusterStorage\\Volume1\\3Y6S9438\\3Y6S9438",
    "SnapshotFileLocation": "C:\\ClusterStorage\\Volume1\\3Y6S9438\\3Y6S9438\\",
    "AutomaticStartAction": 2,
    "AutomaticStopAction": 4,
    "AutomaticStartDelay": 0,
    "SmartPagingFilePath": "C:\\ClusterStorage\\Volume1\\3Y6S9438\\3Y6S9438\\",
    "NumaAligned": true,
    "NumaNodesCount": 1,
    "NumaSocketCount": 1,
    "Key": {
      "Id": "cd12132a-424d-4a90-9be2-cc521c5cdf8a"
    },
    "IsDeleted": false,
    "ComputerName": "AB124322",
    "Version": "5.0",
    "Notes": "#CLUSTER-INVARIANT#:{f5f3cfe0-28e7-479a-a39d-679975bcd81f}",
    "Generation": 1,
    "Path": "C:\\ClusterStorage\\Volume1\\3Y6S9438\\3Y6S9438",
    "CreationTime": "/Date(1466293818382)/",
    "IsClustered": true,
    "SizeOfSystemFiles": 55480,
    "ParentSnapshotId": null,
    "ParentSnapshotName": null,
    "MemoryStartup": 2147483648,
    "DynamicMemoryEnabled": false,
    "MemoryMinimum": 536870912,
    "MemoryMaximum": 4294967296,
    "ProcessorCount": 2,
    "RemoteFxAdapter": null,
    "NetworkAdapters": [
      "Microsoft.HyperV.PowerShell.VMNetworkAdapter"
    ],
    "FibreChannelHostBusAdapters": [],
    "ComPort1": {
      "Path": "",
      "ComputerName": "AB124322",
      "Name": "COM 1",
      "Id": "Microsoft:CD12132A-424D-4A90-9BE2-CC521C5CDF8A\\8E3A359F-559A-4B6A-98A9-1690A6100ED7\\0",
      "IsDeleted": false,
      "VMId": "cd12132a-424d-4a90-9be2-cc521c5cdf8a",
      "VMName": "3Y6S9438",
      "VMSnapshotId": "00000000-0000-0000-0000-000000000000",
      "VMSnapshotName": null,
      "Key": null
    },
    "ComPort2": {
      "Path": "",
      "ComputerName": "AB124322",
      "Name": "COM 2",
      "Id": "Microsoft:CD12132A-424D-4A90-9BE2-CC521C5CDF8A\\8E3A359F-559A-4B6A-98A9-1690A6100ED7\\1",
      "IsDeleted": false,
      "VMId": "cd12132a-424d-4a90-9be2-cc521c5cdf8a",
      "VMName": "3Y6S9438",
      "VMSnapshotId": "00000000-0000-0000-0000-000000000000",
      "VMSnapshotName": null,
      "Key": null
    },
    "FloppyDrive": {
      "PoolName": null,
      "Path": null,
      "Disk": null,
      "ComputerName": "AB124322",
      "Name": "Diskette Drive",
      "Id": "Microsoft:CD12132A-424D-4A90-9BE2-CC521C5CDF8A\\8F0D2762-0B00-4E04-AF4F-19010527CB93\\0\\0\\D",
      "IsDeleted": false,
      "VMId": "cd12132a-424d-4a90-9be2-cc521c5cdf8a",
      "VMName": "3Y6S9438",
      "VMSnapshotId": "00000000-0000-0000-0000-000000000000",
      "VMSnapshotName": null,
      "Key": null
    },
    "DVDDrives": [
      "Microsoft.HyperV.PowerShell.DvdDrive"
    ],
    "HardDrives": [
      "Microsoft.HyperV.PowerShell.HardDiskDrive"
    ],
    "VMIntegrationService": [
      "Microsoft.HyperV.PowerShell.VMIntegrationComponent",
      "Microsoft.HyperV.PowerShell.VMIntegrationComponent",
      "Microsoft.HyperV.PowerShell.DataExchangeComponent",
      "Microsoft.HyperV.PowerShell.ShutdownComponent",
      "Microsoft.HyperV.PowerShell.VMIntegrationComponent",
      "Microsoft.HyperV.PowerShell.GuestServiceInterfaceComponent"
    ],
    "VMName": "3Y6S9438",
    "VMId": "cd12132a-424d-4a90-9be2-cc521c5cdf8a"
  },

由于返回了多个结果(未显示),我没有得到任何关于 NetworkAdapters 数组或硬盘驱动器的信息

所以,我知道我不想要所有这些属性。所以我可以用 Select 缩小范围

Get-VM | Select Id, Name, NetworkAdapters, HardDrives, etc...

但如果返回多个结果,我仍然会遇到同样的问题。我没有得到有关硬盘驱动器或网络适配器的这些阵列的任何信息。

我阅读过使用 ExpandProperty,但遇到了这个问题:

select : The property cannot be processed because the property "Id" already exists.

有人有什么建议吗?

另外,我也不需要网络对象的所有 56 个属性。我也可以对网络查询运行选择以缩小范围吗?

谢谢

编辑:

导致错误的命令示例

get-vm -ComputerName AB124322 | select name, id, state -ExpandProperty networkadapters

我得到这个错误

The property cannot be processed because the property "Name" already exists.

【问题讨论】:

  • 我对@9​​87654326@ 没有意见。你能包括代码吗?示例@(get-vm | select -ExpandProperty networkadapters ) | Select-Object vmname,vmid, name, id
  • @TravisEz13 [我更新了我的原始帖子] 是的,您的示例有效,因为它只是获取有关网络适配器的信息。我希望将网络适配器作为 vm 对象内的嵌套项。下面是一个错误代码示例:get-vm -ComputerName SE124321 |选择名称、ID、状态 -ExpandProperty 网络适配器
  • 这不会尝试返回“网络适配器作为 vm 对象内的嵌套项”,因此会出现错误。 NetworkAdapters 具有一些与 VM 对象相同的属性,当您告诉 select-object 使用“ExpandProperty”将它们展平在一起时,就会发生冲突。 Get-VM 默认返回你所说的你想要的。你能澄清一下这个问题吗?
  • @TravisEz13 这就是我的想法。我只是不确定如何实现我正在寻找的东西。是的,你确实描述了我正在寻找的东西。但问题是,如果只返回一个搜索结果,Get-VM 只会获取 networkadapters 对象。如果有多个,您只会得到字符串“Microsoft.HyperV.PowerShell.VMNetworkAdapter”,如我在原始问题中给出的示例中所示。因此,为什么我要在结果中扩展对象

标签: json powershell


【解决方案1】:

老问题,但你应该使用内联表达式来解决这个问题。

get-vm -ComputerName AB124322 | select @{n="name1";e={$_.name}}, id, state -ExpandProperty networkadapters

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-17
    相关资源
    最近更新 更多