使用计算属性时,Group-Object显示哈希表

时间:2017-03-08 10:21:38

标签: powershell grouping powershell-v4.0

背景

从预定义的服务器名称列表中,我搜索配置文件并尝试为每个服务器分组找到的所有文件。文件名可以映射到应用程序。

问题

分组部分给我带来了麻烦。它不断返回一个哈希表,我只想要返回文件名。

SSCCE 注意:分组是在sscce中的文件名,但问题的要点是相同的

此示例显示找到匹配的整行,而不是匹配

@("A test", "Another test") | sls -pattern "\btest\b" | group filename | select name, group

为了适应这种情况,我添加了一个计算属性以仅获得匹配。不幸的是,这将该组显示为哈希表。

@("A test", "Another test") | sls -pattern "\btest\b" | select filename, @{n="Server";e={$_.matches[0].Value}} | group filename | select name, group

TLDR;以下是我目前使用的

@(
  "server1"
  , "server2"
) | 
% {sls -path "C:\PrivateWS\sources\confdoc\applicaties\*.yml" -Pattern "\b$($_)\b"} | 
select Filename, @{n="Server";e={$_.matches[0].Value}} | 
group server | select name, group

,这会返回类似这样的内容

Name    Group                                                                                                                                                                                              
----    -----                                                                                                                                                                                              
server1 {@{Filename=applicationX.yml; Server=server1}, @{Filename=applicationY.yml; Server=server1}}                                                                                 
server2 {@{Filename=applicationX.yml; Server=server2}}

我想让它返回

Name    Group                                                                                                                                                                                              
----    -----                                                                                                                                                                                              
server1 {applicationX.yml, applicationY.yml}                                                                                 
server2 {applicationX.yml}

2 个答案:

答案 0 :(得分:1)

这是否符合您的要求(替换代码的最后一行):

group server | select name, @{name='group'; expression={$_.group | Select -ExpandProperty Filename}}

摆脱哈希/花括号:

group server | select name, @{name='group'; expression={(@($_.Group | Select -ExpandProperty Filename)) -join ', '}}

答案 1 :(得分:1)

您看到的是自定义对象的字符串表示形式,而不是哈希表。你得到的是,因为Group-Object不仅仅对输入对象的一个​​属性进行分组,而是对整个对象进行分组。

我认为您真正想要的是将您的组列表转换为哈希表:

$ht = @{}
'server1', 'server2' |
    ForEach-Object { Select-String ... } |
    Select-Object Filename, @{n="Server";e={$_.matches[0].Value}} |
    Group-Object server |
    ForEach-Object { $ht[$_.Name] = $_.Group | Select-Object -Expand Filename }