遍历哈希 table,找到一个小于数字的值,并将其添加到新的哈希 table

Looping through a hash table, finding a value less than a number, and adding that to a new hashtable

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

    $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)

循环完成后,我想遍历列表并将 space 小于 80 的服务器添加到不同的 table 使用

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

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

假设您的哈希表的值是 [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 足够聪明,知道如何比较持有数字的 stringinteger。不需要投[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