Group-Object 在使用计算属性时显示哈希表
Group-Object is showing a hashtable when using calculated properties
背景
从预定义的服务器名称列表中,我在配置文件中搜索并尝试为每台服务器对找到的所有文件进行分组。文件名可以映射到应用程序。
问题
分组部分给我带来了问题。它保持 returning 一个哈希列表,我只想要文件名 returned.
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
这个return是这样的
Name Group
---- -----
server1 {@{Filename=applicationX.yml; Server=server1}, @{Filename=applicationY.yml; Server=server1}}
server2 {@{Filename=applicationX.yml; Server=server2}}
我想要它的地方return这个
Name Group
---- -----
server1 {applicationX.yml, applicationY.yml}
server2 {applicationX.yml}
这是否满足您的要求(替换您代码的最后一行):
group server | select name, @{name='group'; expression={$_.group | Select -ExpandProperty Filename}}
并去掉 hash/curly 大括号:
group server | select name, @{name='group'; expression={(@($_.Group | Select -ExpandProperty Filename)) -join ', '}}
您看到的是自定义对象的字符串表示形式,而不是哈希表。你明白了,因为 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 }
背景
从预定义的服务器名称列表中,我在配置文件中搜索并尝试为每台服务器对找到的所有文件进行分组。文件名可以映射到应用程序。
问题
分组部分给我带来了问题。它保持 returning 一个哈希列表,我只想要文件名 returned.
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
这个return是这样的
Name Group
---- -----
server1 {@{Filename=applicationX.yml; Server=server1}, @{Filename=applicationY.yml; Server=server1}}
server2 {@{Filename=applicationX.yml; Server=server2}}
我想要它的地方return这个
Name Group
---- -----
server1 {applicationX.yml, applicationY.yml}
server2 {applicationX.yml}
这是否满足您的要求(替换您代码的最后一行):
group server | select name, @{name='group'; expression={$_.group | Select -ExpandProperty Filename}}
并去掉 hash/curly 大括号:
group server | select name, @{name='group'; expression={(@($_.Group | Select -ExpandProperty Filename)) -join ', '}}
您看到的是自定义对象的字符串表示形式,而不是哈希表。你明白了,因为 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 }