Was ist in Powershell der beste Weg, zwei Tabellen zu einer zu verbinden?

8

Ich bin mit Powershell ziemlich neu und frage mich, ob jemand einen besseren Weg kennt, um das folgende Beispielproblem zu lösen.

Ich habe ein Array von Zuordnungen von IP-Adresse zu Host-Name. Dies stellt eine Liste der aktiven DHCP-Leases dar:

%Vor%

Ich habe ein anderes Array von Mappings von MAC-Adresse zu IP-Adresse. Dies stellt eine Liste von IP-Reservierungen dar:

%Vor%

Aus praktischen Gründen konnte ich unter Verwendung des folgenden Codes ein drittes Array von Mappings von MAC-Adresse zu IP-Adresse und Host-Namen erstellen. Die Idee ist, dass $reservations ein drittes Feld, "Name", erhalten sollte, das immer dann gefüllt wird, wenn ein passendes "IP" -Feld vorhanden ist:

%Vor%

Die gewünschte Ausgabe ist etwa so:

%Vor%

Gibt es einen besseren Weg, dies zu tun?

    
Michael Steele 04.12.2009, 18:31
quelle

2 Antworten

7

Lee Holmes schrieb ein Blog-Post auf einer Join-Objekt-Funktion , die das tut, was Sie wollen. Schade, dass es noch nicht in PowerShell integriert ist.

    
Keith Hill 04.12.2009, 18:39
quelle
7

Join-Objekt

Die Join-Object (Alias ​​ Join ) Funktion kombiniert Spalten von zwei Objekt-Arrays zu einem neuen Objekt-Array, das als Tabelle ( Export-CSV ) gespeichert oder wie es ist verwendet werden kann.

%Vor%

Syntax

<Object[]> | InnerJoin|LeftJoin|RightJoin|FullJoin <Object[]> [-On <String>|<Array>|<ScriptBlock>] [-Merge <HashTable>|<ScriptBlock>] [-Eq <String>]

InnerJoin|LeftJoin|RightJoin|FullJoin <Object[]>,<Object[]> [-On <String>|<Array>|<ScriptBlock>] [-Merge <HashTable>|<ScriptBlock>] [-Eq <String>]

InnerJoin|LeftJoin|RightJoin|FullJoin -LeftTable <Object[]> -RightTable <Object[]> [-On <String>|<Array>|<ScriptBlock>] [-Merge <HashTable>|<ScriptBlock>] [-Eq <String>]

Befehle

Die Funktion Join-Object (alias Join ) ist eine Funktion mit mehreren Aliasen, die zwei Tabellen (die jeweils aus einem Array von PSCustomObjects ) ähnlich wie die entsprechenden SQL Join Anweisungen. Der standardmäßige Join-Typ ist ein InnerJoin .

  • InnerJoin-Object (alias InnerJoin )
    Gibt Datensätze mit übereinstimmenden Werten in beiden Tabellen zurück.

  • LeftJoin-Object (alias LeftJoin )
    Gibt alle Datensätze aus der linken Tabelle und die übereinstimmenden Datensätze aus der rechten Tabelle zurück.

  • RightJoin-Object (alias RightJoin )
    Gibt alle Datensätze aus der rechten Tabelle und die übereinstimmenden Datensätze aus der rechten Tabelle zurück.

  • FullJoin-Object (alias FullJoin )
    Gibt alle Datensätze zurück, wenn eine Übereinstimmung in der linken oder rechten Tabelle vorhanden ist.

Notizen

  1. Alle Join -Befehle sind mit PowerShell Version 2 und höher kompatibel.

Parameter

-LeftTable <Object[]> und -RightTable <Object[]>

Die Parameter -LeftTable und RightTable definieren die linke und rechte Tabelle, die verbunden werden soll. Es gibt drei mögliche Syntaxen zur Bereitstellung der Tabellen:

  • Verwenden der PowerShell-Pipeline: <LeftTable> | Join <RightTable>

  • Liefern der beiden Tabellen in einem Array (getrennt durch ein Komma) an der ersten Argumentposition: Join <LeftTable>,<RightTable>

  • Liefern der beiden Tabellen mit benannten Argumenten: Join -Left <LeftTable> -Right <RightTable>

Notizen

  1. Wenn nur eine Tabelle angegeben wird ( Join <Table> ), wird automatisch ein Self-Join erstellt > wird auf dem Tisch durchgeführt.

-On <String>|<Array>|<ScriptBlock> und -Equals <String>

Der Parameter -On (alias Using ) definiert die Bedingung, die angibt, wie Tabellen verbunden werden und welche Zeilen in der (inneren) Ergebnismenge enthalten sein sollen. Der Parameter -On unterstützt die folgenden Formate:

  • String -Equals <String> Wenn der Wert -On ein String ist und die Parameter -Equals <String> angegeben sind, muss die Eigenschaft in der linken Spalte, die durch den Wert -On definiert wird, der Eigenschaft in der rechten Spalte entsprechen, die durch -equals definiert ist. Wert, der in der (inneren) Ergebnismenge enthalten sein soll.

  • String oder Array Wenn der Wert ein String oder Array ist, ist der Parameter -On der SQL using -Klausel ähnlich. Dies bedeutet, dass alle aufgelisteten Eigenschaften gleich (auf der linken und rechten Seite) sein müssen, um in der (inneren) Ergebnismenge enthalten zu sein. Die aufgelisteten Eigenschaften geben standardmäßig einen einzelnen Wert aus (siehe auch -Expressions ).

  • ScriptBlock Jeder bedingte Ausdruck, wobei $Left die linke Zeile definiert, $Right die rechte Zeile.

Notizen

  1. Der ScriptBlock -Typ hat die meisten Vergleichsmöglichkeiten, ist aber erheblich langsamer als die anderen Typen.

  2. Wenn der Parameter -On weggelassen wird oder von einem unbekannten Typ, cross-join wird ausgeführt.

-Merge <HashTable>|<ScriptBlock>

Definiert, wie die spezifischen Spalten mit demselben Namen zusammengeführt werden sollen. Der Parameter -Merge akzeptiert Typen: a HashTable enthält den spezifischen Merge-Ausdruck für jede Spalte oder ScriptBlock enthält den Standard-Merge-Ausdruck für alle Spalten, für die kein Merge-Ausdruck definiert ist.
Wo im Ausdruck:

  • $_ enthält jeden Spaltennamen.
  • $Left enthält die linke Zeile und $Right enthält die rechte Zeile.
  • $Left.$_ enthält jeden linken Wert und $Right.$_ enthält jeden richtigen Wert.
  • $LeftIndex enthält den aktuellen Index der linken Zeile und $RightIndex enthält den aktuellen Index der rechten Zeile.

Anmerkungen:

  1. Ausdrücke werden nur ausgeführt, wenn sowohl der linke Wert ( Left.$_ ) als auch der rechte Wert ( Left.$_ ) vorhanden sind (einschließlich der Werte $Null ), andernfalls wird nur der existierende Wert zurückgegeben.

  2. Wenn für eine Spalte kein Ausdruck definiert ist, wird der Ausdruck {$Left.$_, $Right.$_} verwendet. Dies bedeutet, dass beide Werte (in einem Array) der aktuellen Eigenschaft zugewiesen sind.

  3. Der Ausdruck für Spalten, die durch -On <String> , -Equals <String> und -On <Array> definiert sind, lautet: {$Left.$_} und kann nur durch einen spaltenspezifischen Ausdruck, der in einer Hash-Tabelle definiert ist, überschrieben werden. Dies bedeutet, dass ein einzelner Wert (entweder $Left oder $Right , der nicht gleich $Null ist) der aktuellen Eigenschaft zugewiesen wird.

  4. Um spaltenspezifische Ausdrücke zu verwenden und definieren Sie einen Standardausdruck, verwenden Sie einen Schlüsselnamen mit der Länge null für den Standardausdruck, z. -Merge @{"" = {$Left.$_}; "Column Name" = {$Right.$_}}

Beispiele

Gegeben die folgenden Tabellen:

%Vor% %Vor%

Aktualisiere die Serviceliste (ersetze existierende Dienste für den Namen und füge neue hinzu)

%Vor%

Aktualisieren Sie die Prozessliste und fügen Sie nur Prozesse mit einer höheren CPU ein

%Vor%

Die neueste Version von Join-Object finden Sie unter Ссылка

    
iRon 03.08.2017 11:39
quelle

Tags und Links