我正在开发一个名为Merge-Xsd
可以合并相似的 XML 模式。它需要一个路径列表,加载模式,合并它们,并生成一个XMLDocument
作为输出。
特定文件名的所有模式都被认为是“相似的”,所以我正在做的就是获取特定目录结构中的所有子项,根据文件名对它们进行分组,然后尝试将它们传递给我的自定义cmdlet。
将它们分组很容易:
$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\$_") }
但我要什么really喜欢能够做的是使用ForEach-Object
紧接着Group-Object
迭代每个组项目,从而消除了单独的需要$grouping
多变的。
我该如何使用ForEach-Object
获取键/值对,同时保留每次调用Merge-Xsd
范围仅限于该特定的键/值对?
20150224更新:
The 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
and -AsString
参数,以便我们可以直接处理返回的组对象Group-Object
.
The $_.Group.FullName
比乍一看更复杂。$_
这里指的是单个组对象,因为我们处于ForEach-Object
。组对象包含一个名为Name
这是组的名称,以及一个名为Group
这实际上是组内各个项目的集合,所以$_.Group
是一个集合。
从这里开始,管道就有意义了that to ForEach-Object
同样,由于该集合中的每个项目都将是一个 FileInfo 对象,并且您想要获取FullName
要传递给的财产Merge-Xsd
.
在这里,我们利用了一些 powershell 魔法。当你参考$c.Property
where $c
是一个对象的集合Property
属性,您将返回一个由属性对象组成的集合。
So $props = $c.Property
是相同的:
$props = $c | ForEach-Object { $_.Property }
知道了这一点,我们就可以通过管道$_.Group.FullName
直接进入Merge-Xsd
传递组中所有文件的所有全名.
在这种背景下,$_.Name
仍然引用组对象,因此它是组的名称,而不是文件的名称。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)