Могу ли я выбрать свойство и вложенное свойство в однострочнике Powershell

#powershell

#powershell

Вопрос:

Я пытаюсь получить массив MAC-адресов в формате JSON и связанные IP-адреса DHCP-арендаторов с DHCP-сервера Windows с помощью PowerShell.

Используя это: Get-DhcpServerv4Lease -ScopeId 192.168.0.0 | Where-Object {$_.AddressState -eq "ActiveReservation"} | Select-Object -Property ClientId,IPAddress | ConvertTo-Json

Я получаю этот вывод:

 [
  {
    "ClientId": "00-11-22-33-44-55",
    "IPAddress": {
      "Address": 12345678,
      "AddressFamily": 2,
      "ScopeId" : null,
      "IPAddressToString": "192.168.0.2"
    }
  },
  {
    "ClientId": "00-11-22-33-44-66",
    "IPAddress": {
      "Address": 12345679,
      "AddressFamily": 2,
      "ScopeId" : null,
      "IPAddressToString": "192.168.0.3"
    }
  }
]
  

Но мне нужны только идентификатор клиента и значение IPAddressToString, а не другие свойства:

 [
  {
    "ClientId": "00-11-22-33-44-55",
    "IPAddressToString": "192.168.0.2"
  },
  {
    "ClientId": "00-11-22-33-44-66",
    "IPAddressToString": "192.168.0.3"
  }
]
  

Возможно ли это в однострочном?

Ответ №1:

Попробуйте это

 Get-DhcpServerv4Lease -ScopeId 192.168.0.0 | Where-Object { $_.AddressState -eq "ActiveReservation" } |  Select-Object -Property ClientId, @{Name = "Address"; Expression = { $_.IpAddress.IPAddressToString} } | ConvertTo-Json
  

Ответ №2:

Поскольку этот возвращаемый json является массивом, я думаю, вам нужно перебирать элементы, такие как

 Get-DhcpServerv4Lease -ScopeId 192.168.0.0 | 
    Where-Object {$_.AddressState -eq "ActiveReservation"} | 
    ForEach-Object {
        $_ | Select-Object ClientId, @{Name = 'IPAddress'; Expression = {$_.IPAddress.IPAddressToString}}
    } | ConvertTo-Json
  

Вывод:

[
 {
 "ClientID": "00-11-22-33-44-55",
 "IP-адрес": "192.168.0.2"
 }, 
{ 
 "ClientID": "00-11-22-33-44-66", 
 "IP-адрес": "192.168.0.3"
 }
]

Постскриптум Вы можете написать это как однострочный, но это затруднило бы чтение кода, упростило бы ошибки и ничего не дало бы путем написания ДЛИННЫХ строк кода. Вы только усложните себе задачу, сделав это