背景
从预定义的服务器名称列表中,我搜索配置文件并尝试为每个服务器分组找到的所有文件。文件名可以映射到应用程序。
问题
分组部分给我带来了麻烦。它不断返回一个哈希表,我只想要返回文件名。
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}
答案 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 }