Каков наилучший способ объединить две таблицы в одну в Powershell?

StackOverflow https://stackoverflow.com/questions/1848821

  •  13-09-2019
  •  | 
  •  

Вопрос

Я довольно новичок в Powershell, и мне интересно, знает ли кто-нибудь какой-нибудь лучший способ решить проблему в следующем примере.

У меня есть массив сопоставлений от IP-адреса до имени хоста.Это представляет собой список активных договоров аренды DHCP:

PS H:\> $leases

IP                    Name
--                    ----
192.168.1.1           Apple
192.168.1.2           Pear
192.168.1.3           Banana
192.168.1.99          FishyPC

У меня есть еще один массив сопоставлений MAC-адреса с IP-адресом.Это представляет собой список резервирований IP-адресов:

PS H:\> $reservations

IP                    MAC
--                    ---
192.168.1.1           001D606839C2
192.168.1.2           00E018782BE1
192.168.1.3           0022192AF09C
192.168.1.4           0013D4352A0D

Для удобства я смог создать третий массив сопоставлений из MAC-адреса в IP-адрес и имя хоста, используя следующий код.Идея заключается в том, что $reservations должно появиться третье поле, "Имя", которое заполняется всякий раз, когда есть соответствующее поле "IP":

$reservations = $reservations | foreach {
    $res = $_
    $match = $leases | where {$_.IP -eq $res.IP} | select -unique
    if ($match -ne $NULL) {
        "" | select @{n="IP";e={$res.IP}}, @{n="MAC";e={$res.MAC}}, @{n="Name";e={$match.Name}}
    }
}

Желаемый результат выглядит примерно так:

PS H:\> $ideal

IP                    MAC                 Name
--                    ---                 ----
192.168.1.1           001D606839C2        Apple
192.168.1.2           00E018782BE1        Pear
192.168.1.3           0022192AF09C        Banana
192.168.1.4           0013D4352A0D

Есть ли какой-нибудь лучший способ сделать это?

Это было полезно?

Решение

Ли Холмс написал запись в блоге о функции объединения объектов это делает то, что ты хочешь.Жаль, что это еще не встроено в PowerShell.

Другие советы

По прошествии 1,5 лет командлет, который я вставил в исходный ответ, претерпел столько обновлений, что полностью устарел.Поэтому я заменил код и тот Прочитай меня со ссылкой на последнюю версию.

Присоединиться-Объект

Командлет Join-Object можно загрузить из галереи PowerShell с помощью команды:

Install-Script -Name Join

В Join пакет включает в себя Join-Object (псевдоним Join) команда и следующие прокси - команды:

  • InnerJoin-Object, псевдоним InnerJoin (Join-Object -JoinType Inner)
    Возвращает только соединенные объекты
  • LeftJoin-Object, псевдоним LeftJoin (Join-Object -JoinType Left)
    Возвращает соединенные объекты и остальные оставленные объекты
  • RightJoin-Object, псевдоним RightJoin (Join-Object -JoinType Right)
    Возвращает соединенные объекты и остальные нужные объекты
  • FullJoin-Object, псевдоним FullJoin (Join-Object -JoinType Full)
    Возвращает соединенные объекты и остальные левые и правые объекты
  • CrossJoin-Object, псевдоним CrossJoin (Join-Object -JoinType Cross)
    Соединяет каждый левый объект с каждым правым объектом
  • Update-Object, псевдоним Update (Join-Object -JoinType Left -Merge = {RightOrLeft.$_})
    Обновляет левый объект свойствами правого объекта
  • Merge-Object, псевдоним Merge (Join-Object -JoinType Full -Merge = RightOrLeft.$_})
    Обновляет левый объект свойствами правого объекта и вставляет справа, если значения соответствующего свойства не равны.

Прочитай меня

Полный ReadMe (и исходный код) доступен на GitHub: https://github.com/iRon7/Join-Object

Установка

После загрузки (Install-Script -Name Join), скрипт может быть просто вызван с помощью точечный поиск:

. .\Join.ps1

Вы также можете рассмотреть возможность преобразования скрипта в модуль PowerShell, переименовав его в модуль PowerShell (.psm1) файл и перемещение его в одну из папок модуля, определенных в $env:PSModulePath.Для получения более подробной информации смотрите: Как написать модуль сценария PowerShell.
Примечание: в Import-Module команда требуется для загрузки прокси-команд.

Ответ

Чтобы ответить на фактический пример в вопросе:

$reservations | LeftJoin $leases -On IP

IP          MAC          Name
--          ---          ----
192.168.1.1 001D606839C2 Apple
192.168.1.2 00E018782BE1 Pear
192.168.1.3 0022192AF09C Banana
192.168.1.4 0013D4352A0D

Примеры

Дополнительные примеры можно найти в соответствующих вопросах Stackoverflow по адресу:

И в Сценарий тестирования Join-Объекта.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top