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:
Die gewünschte Ausgabe ist etwa so:
%Vor%Gibt es einen besseren Weg, dies zu tun?
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.
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.
<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>]
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
Join
-Befehle sind mit PowerShell Version 2 und höher kompatibel. -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
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
Der ScriptBlock
-Typ hat die meisten Vergleichsmöglichkeiten, ist aber erheblich langsamer als die anderen Typen.
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:
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.
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.
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.
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.$_}}
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 Ссылка
Tags und Links scripting powershell dhcp