Dans Powershell, quel est le meilleur moyen de joindre deux tables en une seule?
Je suis assez nouveau dans Powershell, et je me demande si quelqu'un sait de toute meilleur moyen d'atteindre l'exemple suivant problème.
J'ai un tableau de correspondance entre adresse IP en nom d'hôte. Cela représente une liste des baux 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
J'ai un autre tableau de correspondance entre l'adresse MAC à l'adresse IP. Cela représente une liste d'IP réservations:
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
Pour des raisons de commodité, j'ai été en mesure de produire un troisième tableau de correspondance entre l'adresse MAC à l'adresse IP et le nom d'hôte en utilisant le code suivant. L'idée est que $reservations
devriez obtenir un troisième champ "Nom", qui est peuplée dès qu'il y a une correspondance "IP" champ:
$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}}
}
}
La sortie désirée est quelque chose comme ceci:
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
Est-il une meilleure manière de faire ceci?
Comment avez-vous été en mesure d'obtenir une table pour Adresse IP à un Nom d'Hôte pour tous les baux actifs? J'ai été en utilisant le module DHCP, mais ne peut pas le comprendre. Je suis aussi en train d'essayer de combiner certaines de ces tables.
J'ai été en utilisant
netsh
's de commande dhcp pour obtenir une liste, et ensuite, l'analyse de la sortie avec des expressions régulières. Il y a aussi le Serveur DHCP de l'API de Gestion, mais il est uniquement disponible en code natif. Je ne suis pas au courant de tout module powershell ou .net-library pour faire ce genre de chose. J'ai fini par écrire P/Invoke wrappers pour le Serveur DHCP de l'API de Gestion.
OriginalL'auteur Michael Steele | 2009-12-04
Vous devez vous connecter pour publier un commentaire.
Lee Holmes a écrit un blog sur l'adhésion de la fonction de l'Objet qui fait ce que vous voulez. Dommage qu'il n'est pas intégré dans PowerShell encore.
Voici un autre exemple: blogs.msdn.microsoft.com/powershell/2012/07/13/join-object
OriginalL'auteur Keith Hill
Rejoignez-Objet
La
Rejoignez-Objet
(aliasJoin
) la fonction combine les colonnes à partir de deux tableaux d'objets dans un nouveau tableau d'objets qui peuvent être enregistrées dans un tableau (Export-CSV
) ou de l'utiliser comme il est.Syntaxe
<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>]
Commandes
La
Join-Object
(aliasJoin
) la fonction est une fonction avec plusieurs alias qui joint deux tables (chacun composé d'un tableau de PSCustomObjects) similaire à la Jointure SQL instructions. La valeur par défaut type de jointure est unInnerJoin
.InnerJoin-Object
(aliasInnerJoin
)Renvoie les enregistrements qui ont des valeurs correspondantes dans les deux tables.
LeftJoin-Object
(aliasLeftJoin
)Renvoie tous les enregistrements de la table de gauche et les enregistrements correspondants de la table de droite.
RightJoin-Object
(aliasRightJoin
)Renvoie tous les enregistrements de la table de droite et les enregistrements correspondants de la table de droite.
FullJoin-Object
(aliasFullJoin
)Renvoie tous les enregistrements lorsqu'il existe une correspondance à gauche ou à droite de la table.
Notes
Join
commandes sont compatibles avec PowerShell version 2 et plus.Paramètres
-LeftTable <Object[]>
et-RightTable <Object[]>
La
-LeftTable
etRightTable
paramètres définissent la gauche et la droite de la table pour être rejoint. Il y a trois syntaxis pour la fourniture de tables:En utilisant le PowerShell pipeline:
<LeftTable> | Join <RightTable>
La fourniture de deux tables dans un tableau (séparés par une virgule) à la première position argument:
Join <LeftTable>,<RightTable>
La fourniture de deux tables avec des arguments nommés:
Join -Left <LeftTable> -Right <RightTable>
Notes
Join <Table>
), une auto auto-jointure sera effectuée sur la table.-On <String>|<Array>|<ScriptBlock>
et-Equals <String>
La
-On
(aliasUsing
) ce paramètre définit la condition de spécifier comment joindre les tables et les lignes à inclure dans le (intérieure) jeu de résultats. Le-On
paramètre prend en charge les formats suivants:String -Equals <String>
Si le
-On
valeur est unString
et la-Equals <String>
paramètres est fournie, à la propriété dans la colonne de gauche définies par le-On
valeur doit être égale à la propriété dans la colonne de droite définie par le-equals
valeur pour être inclus dans l' (intérieure) jeu de résultats.String
ouArray
Si la valeur est un
String
ouArray
la-On
paramètre est similaire à SQLusing
clause. Cela signifie que tous les biens exiger l'égalité (à gauche et à droite) pour être inclus dans l' (intérieure) jeu de résultats. Les biens seront de sortie qu'une seule valeur par défaut (voir aussi-Expressions
).ScriptBlock
Toute expression conditionnelle où
$Left
définit la gauche de la ligne,$Right
définit la ligne droite.Notes
La
ScriptBlock
type a le plus de possibilités de comparaison mais est considérable, plus lent que les autres types.Si le
-On
paramètre est omis ou à partir d'un type inconnu, un la croix-rejoindre sera effectuée.-Merge <HashTable>|<ScriptBlock>
Définit comment les colonnes avec le même nom doivent être fusionnés. Le
-Merge
paramètre accepte de types: unHashTable
contenant le précis de fusion expression pour chaque colonne ouScriptBlock
contenant la valeur par défaut de fusion et d'expression pour toutes les colonnes qui n'ont pas de fusion expression définie.D'où l'expression:
$_
tient chaque nom de colonne.$Left
détient la gauche de la ligne et de$Right
titulaire de la ligne droite.$Left.$_
tient chaque de gauche et$Right.$_
tient chaque valeur de droite.$LeftIndex
détient le courant de gauche index de ligne et$RightIndex
détient le courant de la ligne droite de l'index.Notes:
Expressions n'est effectuée que si les deux de gauche (
Left.$_
) et de droite (Left.$_
) sont existants (y compris les valeurs qui sont$Null
) sinon juste à la sortie de la valeur est retournée.Si aucune expression n'est définie pour une colonne de l'expression
{$Left.$_, $Right.$_}
est utilisé.Cela signifie que les deux valeurs sont affectées (dans un tableau) de la propriété actuelle.
L'expression de colonnes définies par l'
-On <String>
,-Equals <String>
et -Sur<Array>
est:{$Left.$_}
et ne peut être annulée par une colonne spécifique expression définie dans une table de hachage.Cela signifie qu'une seule valeur (
$Left
ou$Right
qui n'est pas égal à$Null
) est affectée à la propriété actuelle.À utiliser la colonne expressions spécifiques et définir une expression par défaut utiliser une longueur de zéro nom de la clé pour l'expression par défaut, par exemple
-Merge @{"" = {$Left.$_}; "Column Name" = {$Right.$_}}
Exemples
Donné les tableaux suivants:
Service de mise à jour de la liste (remplacer les services existants sur le nom et en ajouter de nouvelles)
Processus de mise à jour de la liste et insérez uniquement des processus avec un CPU plus
Pour la dernière
Join-Object
version, voir la PowerShell Galerie ou le site du projet: https://github.com/iRon7/Join-ObjectRévision mise à jour: fusionné les
-Expressions [HashTable]
et-DefaultExpression [ScriptBlock]
paramétrée pour un-Merge [HashTable|ScriptBlock]
qui prend en charge soit unHashTable
spécifiques de fusion des expressions ou d'unScriptBlock
pour une commune de la fusion de l'expression.Résolu un bug où le Table de Gauche contient une seule colonne
La grande fonction, mais attention si vous utilisez de l'intérieur, un module Powershell. En raison de la façon dont les travaux de délimitation de l'étendue, de la
$Left
et$Right
variables ne seront pas disponibles dans le-Merge
bloc de script (modules variables sont privés pour le module, donc le bloc de script ne peut pas les voir). Ce n'est pas un problème si le point approvisionnement ou dont la fonction directement dans le script d'appel.J'ai fait quelques tests avec mettre l'applet de commande dans un module, mais ne pouvait pas confirmer votre question. Néanmoins, lors de la révision de l'applet de commande, j'ai trouvé un gros bug qui est décrit dans le des résultats Inattendus lors de la réutilisation d'objets personnalisés dans le pipeline. J'ai créé un ramifiée version, collées dans cette réponse. Je pense que c'est effectivement la question que vous avez couru dans (je vous en seront reconnaissants si vous pouviez confirmer ou non si c'est le cas).
OriginalL'auteur iRon