比较Powershell中的两个哈希表

时间:2018-07-25 09:00:58

标签: powershell compare hashtable powershell-v2.0

你好,我是初学者,我需要比较两个哈希表并重新生成另一个。

例如:

[hashtable]$alpha =@{
"A1" = "computer";
"A2" = "folder";
"A3" = "plane";
"A4" = "flower";
"A5" = "dog";
}


[hashtable]$beta =@{
"computer" = "P1";
"plane" = "P2";
"garden" = "p3";
"flower" = "P4";
"dog" = "P5";
}

如果我在$alpha$beta中有计算机,则需要为用户A1编写P1 如果我在$alpha$beta中有飞机,我需要为用户A3写P2

我需要使用每个吗?

谢谢!

1 个答案:

答案 0 :(得分:1)

@PetSerAl@LotPings已经提供了该解决方案,并且是以下解决方案之一

$alpha.GetEnumerator() | select Key, @{ n='Value'; e={$beta[$_.Value]} }
$alpha.GetEnumerator() | %{[PSCustomObject]@{aKey=$_.Key;aValue=$_.Value;bValue=$beta[$_.Value]}}

让我解释一下那里到底发生了什么。

首先,当您使用哈希表时,无法使用Select-Object之类的cmdlet直接操作它们。为此,您需要在其上使用GetEnumerator()方法。现在您可以将其传送到Select-Object

要使用另一个哈希表中的值,必须使用计算属性而不是标准属性。它的语法是:

@{ n='name'; e={ expression to be executed }

让我们进一步研究这个表达式$beta[$_.Value]$_代表发送到管道的对象,因此$_.Value是其值(您知道哈希表具有键名和值)。为了更好地了解此表达式及其结果

PS C:\> $alpha.GetEnumerator() | select -Last 1

Name                           Value
----                           -----
A5                             dog

对于此条目,$_.Valuedog,因此$beta[$_.Value]的值为$beta["dog"],其值为:

PS C:\> $beta["dog"]
P5

其他资源:

  1. Microcode: PowerShell Scripting Tricks: The Joy of using Hashtables with Windows PowerShell
  2. Add a calculated property with Select-Object in PowerShell
  3. Example of the same but with multiple values to be replaced (my answer)