【问题标题】:Checking for identical hashtable values检查相同的哈希表值
【发布时间】:2013-08-20 15:07:46
【问题描述】:

如何循环遍历哈希表以验证所有值是否相同?

我有一个从活动目录查询返回哈希表的脚本。从每个服务器返回的值应该是相同的,所以如果所有值都相同,我想返回 true,如果任何值与其他值不匹配,我想返回 false。理想情况下,即使添加了第 4 台或第 5 台服务器而无需更新脚本,这也能正常工作。

Name                           Value
----                           -----
server1                        0
server2                        0
server3                        0

【问题讨论】:

  • 你目前的脚本是什么?
  • Function checkAccountReplication ($user, $property) { $servers = "server1", "server2", "server3" $results = @{} $servers | Foreach-Object {$results.($_) = (get-aduser $user -server $_ -property $property | select -ExpandProperty $property)} $results | ft }

标签: powershell hashtable


【解决方案1】:

@($h.Values | Group-Object).Count -eq 1 不是最有效但非常简单的方法。

例子:

# all the same
$h = @{ server1=0; server2=0; server3=0 }

# gets True
@($h.Values | Group-Object).Count -eq 1

# different
$h = @{ server1=0; server2=0; server3=1 }

# gets False
@($h.Values | Group-Object).Count -eq 1

特殊情况是如何处理包含 0 个项目的表。例如。如果都一样,那么-le 1可以在check中使用。

【讨论】:

  • 返回的值可以是字符串或整数。这仅适用于整数,对吧?
  • 它适用于任何数据类型。但是Group-Object 将您的价值观视为平等的方式可能是也可能不是您想要的。您应该尝试潜在的边缘案例。
【解决方案2】:

要遍历哈希,请将哈希变量的 .Keys 属性通过管道传递到 Foreach-Object 循环:

$MyHash.Keys | %{
  [...code...]
}

在循环中,$_ 被设置为每个键名。要访问循环中的值,请使用$MyHash.$_,例如您可以测试if ($MyHash.$_ -ne $SomeVariable) { [...do something...]}

这就是遍历哈希的方法。我将留给您使用您喜欢的任何逻辑来确定这些值是否都相同。如果您在执行此操作时遇到问题,请发布代码并解释其中的问题。

警告:如果您在循环遍历正在修改的哈希时尝试添加或删除哈希元素,则会收到错误消息。它不适用于这种特殊情况,但在遍历哈希时需要注意。

【讨论】:

    【解决方案3】:

    你试过Compare-Object $ServerList1 $ServerList2吗?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-04
      • 1970-01-01
      • 1970-01-01
      • 2017-04-13
      相关资源
      最近更新 更多