0

我有以下代码从文本文件中提取一些服务器信息并将其吐出到哈希表中。

Get-Content $serverfile | Foreach-Object {     

    if($_ -match '^([^\W+]+)\s+([^\.+]+)')
    {        
            $sh[$matches[1]] = $matches[2]     
    }    
}

$sh.GetEnumerator()| sort -Property Name 

这会产生以下结果:

Name                           Value                                                                                                         
----                           -----                                                                                                         
Disk0                          40                                                                                                            
Disk1                          40                                                                                                            
Disk2                          38                                                                                                            
Disk3                          43                                                                                                            
Memory                         4096                                                                                                          
Name                           Value                                                                                                         
Number_of_disks                1                                                                                                             
Number_of_network_cards        2                                                                                                             
Number_of_processors           1                                                                                                             
ServerName                     WIN02

根据服务器的不同,可能有一个 Disk0 或更多。

我的挑战是从每个不同数量的 Disk 键中提取每个 Disk* 值,并以逗号分隔的列表返回值,例如;

$disks = 40,40,38,43

我已经尝试了不同的方法来解决这个问题,但是没有一个符合动态的标准,并且在每个磁盘之后都包含“,”。

任何帮助,将不胜感激。

4

1 回答 1

1

我假设当您说“取决于服务器可能有一个 Disk0 或更多”时,您的意思是“一个或多个磁盘”,每个都有不同的数字?您不能拥有多个 Disk0,因为键名不能在散列中重复。

这将为您提供以“磁盘”开头的键的所有哈希值的列表:

$sh.Keys | ?{$_ -match '^Disk'} | %{$sh.$_}

如果你真的想得到一个逗号分隔的列表(单个字符串值),你可以使用-join运算符:

$disks = ($sh.Keys | ?{$_ -match '^Disk'} | %{$sh.$_}) -join ','

但是,如果您想要一个逗号分隔列表的原因是为了获取一个值数组,那么您实际上并不需要逗号分隔列表;只需将结果(已经是一个数组)分配给变量:

$disks = $sh.Keys | ?{$_ -match '^Disk'} | %{$sh.$_}

请注意,顺便说一句,哈希没有排序。无法保证列出的键的顺序与您添加它们的顺序或按字母数字升序排列的顺序相同。因此,在上面的示例中,您的结果可能是38,40,43,40. 如果顺序确实很重要(即您指望$disks中的值按照它们各自磁盘编号的顺序排列,那么您有两个选择。

  1. 通过Sort-Object过滤键列表:

    $sh.Keys | ?{$_ -match '^Disk'} | sort |  %{$sh.$_}
    

    (您可以使用| sortbetween$sh.Keys| ?{...,但这种方式更有效......这在这里没有什么区别,但对更大的数据集很重要。)

  2. 使用有序字典,其功能与哈希几乎相同,但按添加的顺序维护键:

    $sh = New-Object System.Collections.Specialized.OrderedDictionary
    
于 2013-09-10T03:51:52.150 回答