我有以下代码从文本文件中提取一些服务器信息并将其吐入哈希表。
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 *值,并以逗号分隔列表的形式返回值,例如;
$disks = 40,40,38,43
我尝试过不同的方法解决这个问题,但是没有一个方法符合动态标准,并且在每个磁盘后都包含','。
任何帮助将不胜感激。
答案 0 :(得分:1)
我认为当你说“根据服务器可能有一个Disk0或更多”时,你的意思是“一个磁盘或更多磁盘”,每个都有不同的数字?您不能拥有多个Disk0,因为密钥名称不能在哈希中重复。
这将为您提供以“Disk”开头的键的所有哈希值的列表:
$sh.Keys | ?{$_ -match '^Disk'} | %{$sh.$_}
如果您确实想要获得以逗号分隔的列表(单个字符串值),则可以使用 -join 运算符:
$disks = ($sh.Keys | ?{$_ -match '^Disk'} | %{$sh.$_}) -join ','
但是,如果你想要一个以逗号分隔的列表的原因是为了得到一个值的数组,你真的不需要以逗号分隔的列表;只需将结果(已经是数组)分配给变量:
$disks = $sh.Keys | ?{$_ -match '^Disk'} | %{$sh.$_}
注意,顺便说一句,哈希没有订购。无法保证列出的键的顺序与您添加它们的顺序或按升序字母数字顺序相同。因此,在上面的示例中,您的结果可能是38,40,43,40
。如果订单确实重要(即您指望 $ disks 中的值按其各自的磁盘编号顺序排列,则有两种选择。
通过排序对象:
过滤键列表$sh.Keys | ?{$_ -match '^Disk'} | sort | %{$sh.$_}
(你可以将| sort
放在$sh.Keys
和| ?{...
之间,但这种效率更高......这在这里没什么区别但是很重要数据集较大。)
使用有序字典,其功能与哈希几乎相同,但按照添加的顺序维护密钥:
$sh = New-Object System.Collections.Specialized.OrderedDictionary