【发布时间】: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.
【问题讨论】:
-
我对@987654326@ 没有意见。你能包括代码吗?示例
@(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