【发布时间】:2021-12-28 00:03:32
【问题描述】:
我正在尝试在 Python 中解析 PowerShell 的 Get-NetIPConfiguration 的结果。
结果包含我想要的默认格式(格式列表)中的值,但在转换为 JSON 时不包含,这是我想要使用的格式。
注意DNSServer是如何被Format-List序列化的:
PS C:\Users\BoppreH> Get-NetIPConfiguration | Format-List
InterfaceAlias : VirtualBox Host-Only Network
InterfaceIndex : 23
InterfaceDescription : VirtualBox Host-Only Ethernet Adapter
IPv4Address : 192.168.56.1
IPv6DefaultGateway :
IPv4DefaultGateway :
DNSServer : fec0:0:0:ffff::1
fec0:0:0:ffff::2
fec0:0:0:ffff::3
[...]
而 ConvertTo-Json -Depth 1 以不同的方式序列化 DNSServer 属性(以完全无用的方式):
PS C:\Users\BoppreH> Get-NetIPConfiguration | ConvertTo-Json -Depth 1
[
{
"Detailed": false,
"ComputerName": "BOPPREH-DESKTOP",
"InterfaceAlias": "VirtualBox Host-Only Network",
"InterfaceIndex": 23,
"InterfaceDescription": "VirtualBox Host-Only Ethernet Adapter",
"CompartmentId": 1,
"NetAdapter": "MSFT_NetAdapter (CreationClassName = \"MSFT_NetAdapter\", DeviceID = \"{EAF79493-7C78-44D2-ADB4-F3EF196D2F49}\", SystemCreationClassName = \"CIM_NetworkPort\", SystemName = \"boppreh-desktop\")",
"NetCompartment": "MSFT_NetCompartment (InstanceID = \";55;\")",
"NetIPv6Interface": "MSFT_NetIPInterface (Name = \"??55??55;\", CreationClassName = \"\", SystemCreationClassName = \"\", SystemName = \"\")",
"NetIPv4Interface": "MSFT_NetIPInterface (Name = \"??55?55;\", CreationClassName = \"\", SystemCreationClassName = \"\", SystemName = \"\")",
"NetProfile": null,
"AllIPAddresses": "192.168.56.1 fe80::d83f:9609:86ff:2b57%23",
"IPv6Address": "",
"IPv6TemporaryAddress": "",
"IPv6LinkLocalAddress": "fe80::d83f:9609:86ff:2b57%23",
"IPv4Address": "192.168.56.1",
"IPv6DefaultGateway": null,
"IPv4DefaultGateway": null,
"DNSServer": "MSFT_DNSClientServerAddress (Name = \"23\", CreationClassName = \"\", SystemCreationClassName = \"\", SystemName = \"23\") MSFT_DNSClientServerAddress (Name = \"23\", CreationClassName = \"\", SystemCreationClassName = \"\", SystemName = \"2\")"
},
[...]
直到深度级别 4,地址才变得可见,但到那时,输出会大几倍,并且更难导航。
我目前的替代方法是将结果通过管道传输到 Select-Object 并使用计算的属性自己转换值(在 DNSServer 的情况下是 $_.DNSServer.ServerAddresses -join " "),但这对于每个属性来说都很麻烦,并且会使其他属性序列化也不一样。
如何强制 JSON 序列化程序像列表格式化程序一样格式化值?
【问题讨论】:
-
这个序列化问题,加上从 Python 调用 PowerShell 时的 2.5 秒延迟,以及缺少网络掩码信息,让我不得不切换到手动解析
ipconfig /all,这可耻。
标签: json powershell serialization json-deserialization