首页 > 解决方案 > 遍历哈希表,找到小于数字的值,并将其添加到新的哈希表中

问题描述

我有一个服务器名称作为键,它的可用空间作为它的值,例如:

    $hash= @{}
#in the loop I get the server name and then I get the space as an integer and add it to the table like:
    $hash.add($server,$space)

循环完成后,我想遍历列表并将空间小于 80 的服务器添加到另一个表中

    $badServers = foreach($entry in $serverSpace){
    if($entry.Keys -le 80){
    $badServers.add($entry) 
    }}

但我的输出最终将每台服务器放入 $badServers。就好像这些值实际上不是列出的。不知道我做错了什么。

标签: powershellfor-loophashtable

解决方案


假设您的哈希表的值是 type [int],例如:

PS /> $hash

Name                           Value
----                           -----
SERVER0                        93   
SERVER1                        87   
SERVER2                        84   
SERVER3                        92   
SERVER4                        83   
SERVER5                        58   
SERVER6                        95   
SERVER7                        62   
SERVER8                        81   
SERVER9                        84   
SERVER10                       59   

你可以这样做:

$result = foreach($key in $hash.Keys)
{
    if($hash[$key] -lt 80)
    {
        [pscustomobject]@{
            Server = $key
            Space = $hash[$key]
        }
    }
}

看着$result你会得到这样的东西:

PS /> $result

Server   Space
------   -----
SERVER5     58
SERVER7     62
SERVER10    59

如果值存储为[string] 但持有实际整数,则需要稍微更改条件:

if([int]$hash[$key] -lt 80){ ... }

编辑说明:

实际上,我的错在这里,PowerShell 足够聪明,知道如何将string持有的数字与integer. 没有必要投[int]


并且,例如,如果哈希值持有像123 Gb,即:

PS /> $hash

Name                           Value
----                           -----
SERVER0                        94 Gb
SERVER1                        80 Gb
SERVER2                        82 Gb
SERVER3                        89 Gb
...
...

您可以执行以下操作:

if([regex]::Match($hash[$key],'\d+').Value -lt 80){ ... }

这将产生:

PS /> $result

Server   Space
------   -----
SERVER5  52 Gb
SERVER6  53 Gb
SERVER8  69 Gb
SERVER9  72 Gb
SERVER10 65 Gb

推荐阅读