2017-03-08 21 views
0

背景集团,目的是使用计算性能

从预定义servernames节点的名单,我在寻找的配置文件,并试图组为每个服务器都在那里它找到的文件时,显示一个哈希表。文件名可以映射到应用程序。

问题

分组部是给我的问题。它不断返回一个散列表,我只是想要返回文件名。

SSCCE注:分组是在SSCCE文件名,但问题的要点是一样的

这个例子是表示在找到匹配的,而不是仅仅是比赛的整条生产线

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

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

@("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} 

回答

1

这是否给你想要(代替最后一行代码):

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

而且摆脱了散列/花括号:

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

谢谢,我已经添加了'-Unique'的选择和它做正是我需要的。 –

+0

没问题。很高兴帮助。 – TechSpud

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 } 
+0

谢谢Ansgar直接设置术语。这也适用。 –