繁体   English   中英

结合Group-Object和ForEach-Object?

[英]Combining Group-Object and ForEach-Object?

我正在开发一个名为Merge-Xsd的cmdlet,它可以合并类似的XML模式。 它采用路径列表,加载模式,合并它们,并生成XMLDocument作为输出。

特定文件名的所有模式都被认为是“相似的”,所以我正在做的是获取特定目录结构中的所有子项,根据文件名对它们进行分组,然后尝试将它们传递给我的自定义小命令。

将它们分组很容易:

$grouping = Get-ChildItem -Recurse -Filter *.xsd |
    Group-Object -Property Name -AsHashTable -AsString

但是,将它们作为同一管道的一部分进行处理则不然。 我已经接近这个了:

$grouping.Keys |
    ForEach-Object { ($grouping[$_] |
        Select-Object -ExpandProperty FullName | Merge-Xsd).Save("C:\Out\$_") }

但我真正希望能够做的是在Group-Object之后直接使用ForEach-Object迭代每个组项,从而消除了对单独的$grouping变量的需要。

如何使用ForEach-Object获取键/值对,同时保持每次调用Merge-Xsd作用于该特定键/值对?

20150224更新:

Merge-Xsd选项集非常基本:

NAME
    Merge-Xsd

SYNTAX
    Merge-Xsd [-Path] <string[]>  [<CommonParameters>]

它实际上只是用于一次性抛出一堆文件并将它们合并到一个输出中,这是一个XmlDocument (我模拟了ConvertTo-Xml的输出。)

我想你可以像这样嵌套它:

Get-ChildItem -Recurse -Filter *.xsd |
    Group-Object -Property Name | 
        ForEach-Object { 
           ($_.Group.FullName | Merge-Xsd).Save("C:\Out\$($_.Name)")
        }

我没有你的cmdlet或文件,但在我的有限测试中,这将有效。

一些解释

我取出了-AsHash-AsString参数,因此我们可以直接处理Group-Object返回的Group-Object

$_.Group.FullName比初看起来更复杂。 $_ here指的是单个组对象,因为我们在ForEach-Object group对象包含一个名为Name的属性,它是组的名称,以及一个名为Group的属性,它实际上是组中各个项的集合,因此$_.Group是一个集合。

从这里开始,将它再次传递给ForEach-Object 有意义的,因为该集合中的每个项都是FileInfo对象,并且您希望将FullName属性传递给Merge-Xsd

在这里,我们利用一些powershell魔力。 当你引用$c.Property ,其中$c是具有Property属性的对象的集合时,你会得到一个由属性对象组成的集合。

所以$props = $c.Property与以下相同:

$props = $c | ForEach-Object { $_.Property }

知道这一点,我们可以将$_.Group.FullName直接传入Merge-Xsd ,传递组中所有文件的所有全名

在该上下文中, $_.Name仍然引用组对象,因此它是组的名称,而不是文件的名称。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM