In Powershell, was ist der beste Weg zum verknüpfen von zwei Tabellen in einer?
Ich bin ziemlich neu in Powershell, und Frage mich, ob jemand weiß, einen besseren Weg, um zu erreichen das folgende Beispiel problem.
Ich habe ein array von Zuordnungen von IP-Adresse zu host-Namen. Dies stellt eine Liste der aktiven DHCP-leases:
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
Habe ich ein weiteres array von Zuordnungen von MAC-Adresse zu IP-Adresse. Dies stellt eine Liste von IP-Reservierungen:
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
Für die Bequemlichkeit, ich war in der Lage zu produzieren eine Dritte Reihe von Zuordnungen von MAC-Adresse zu IP-Adresse und den host-Namen mithilfe der folgenden code. Die Idee ist, dass $reservations
sollte eine Dritte Feld, "Name", welches aufgefüllt wird, wenn es eine passende "IP" - Feld:
$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}}
}
}
Die gewünschte Ausgabe ist so etwas wie dieses:
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
Gibt es eine bessere Möglichkeit, dies zu tun?
- Fast unglaublich, dass dies noch nicht enthalten in der PowerShell
- Wie waren Sie in der Lage, eine Tabelle für die IP-Adresse zu Host-Namen für alle aktiven leases? Ich habe mit dem DHCP-Modul, aber kann es nicht herausfinden. Ich bin auch versucht, zu kombinieren, einige Tabellen.
- Ich war mit
netsh
's dhcp-Befehl, um eine Liste, und dann analysieren Sie die Ausgabe mit regulären Ausdrücken. Es gibt auch die DHCP-Server-Verwaltungs-API, aber es ist nur für native-code. Ich bin mir nicht bewusst, irgendwelche powershell-Modul oder .net-Bibliothek für diese Art der Sache. Ich landete schreiben P/Invoke-Wrapper, um die DHCP-Server-Verwaltungs-API.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Lee Holmes schrieb ein blog-post auf einen Join-Objekt-Funktion das tut, was Sie wollen. Schade, dass es nicht in PowerShell integriert noch.
Nach 1,5 Jahren, das cmdlet hatte ich eingefügt in die ursprüngliche Antwort erfahren hat, so viele updates, es hat sich völlig überholt. Deshalb habe ich ersetzt, die code und die ReadMe mit einem link auf die neueste version.
Join-Objekt
Join-Object-cmdlet können Sie herunterladen aus der PowerShell Gallery mit dem Befehl:
Den
Join
Paket enthält dieJoin-Object
(aliasJoin
) - Befehl und die folgenden proxy-Befehle:InnerJoin-Object
aliasInnerJoin
(Join-Object -JoinType Inner
)Gibt nur die verknüpften Objekte
LeftJoin-Object
aliasLeftJoin
(Join-Object -JoinType Left
)Gibt die verknüpfte Objekte und der rest der linken-Objekte
RightJoin-Object
aliasRightJoin
(Join-Object -JoinType Right
)Gibt die verbundenen Objekte und die übrigen das Recht Objekte
FullJoin-Object
aliasFullJoin
(Join-Object -JoinType Full
)Gibt die verknüpfte Objekte und der rest der linken und rechten Objekte
CrossJoin-Object
aliasCrossJoin
(Join-Object -JoinType Cross
)Verbindet jedes Objekt zu jeder richtigen Objekt
Update-Object
aliasUpdate
(Join-Object -JoinType Left -Merge = {RightOrLeft.$_}
)Updates das linke Objekt mit dem richtigen Objekt-Eigenschaften
Merge-Object
aliasMerge
(Join-Object -JoinType Full -Merge = RightOrLeft.$_}
)Updates das linke Objekt mit dem richtigen Objekt-Eigenschaften und-Einsätze
Recht, wenn die Werte der Eigenschaft nicht identisch.
ReadMe
Die volle ReadMe (und zu source code) ist verfügbar, von GitHub: https://github.com/iRon7/Join-Object
Installation
Nach dem Download (
Install-Script -Name Join
), das Skript kann einfach aufgerufen werden, indem dot-sourcing:Könnte man auch in Betracht ziehen, konvertieren Sie das Skript in einem PowerShell-Modul, indem Sie es umbenennen, um eine PowerShell-Modul (
.psm1
) - Datei und verschieben Sie es an eine ein von Sie das Modul Ordner definiert, in$env:PSModulePath
. Für mehr details siehe: Wie Sie ein PowerShell-Skript Schreiben-Modul.Hinweis: das
Import-Module
Befehl ist erforderlich, um laden Sie die proxy-Befehle.Antwort
Antwort auf die eigentliche Beispiel in der Frage:
Beispiele
Weitere Beispiele finden Sie in den zugehörigen Stackoverflow-Fragen an:
Und in der Join-Objekt test-Skript.
-Expressions [HashTable]
und-DefaultExpression [ScriptBlock]
Parameter zu einem einzigen-Merge [HashTable|ScriptBlock]
, die entweder eineHashTable
für bestimmte merge-Ausdrücke oder eineScriptBlock
für ein gemeinsames Zusammenführen Ausdruck.$Left
und$Right
Variablen werden nicht in der-Merge
script-block (Module' - Variablen sind privat, auf das Modul, damit das Skript blockieren Sie nicht sehen können). Dies ist nicht ein Problem, wenn die dot-sourcing oder auch die Funktion direkt in das Skript, das aufgerufen wird.