我正在开发一个名为Merge-Xsd
可以合并类似XML模式的cmdlet .它采用路径列表,加载模式,合并它们,并生成XMLDocument
输出.
特定文件名的所有模式都被认为是"相似的",所以我正在做的是获取特定目录结构中的所有子项,根据文件名对它们进行分组,然后尝试将它们传递给我的自定义小命令.
将它们分组很容易:
$grouping = Get-ChildItem -Recurse -Filter *.xsd |
Group-Object -Property Name -AsHashTable -AsString
Run Code Online (Sandbox Code Playgroud)
但是,将它们作为同一管道的一部分进行处理则不然.我已经接近这个了:
$grouping.Keys |
ForEach-Object { ($grouping[$_] |
Select-Object -ExpandProperty FullName | Merge-Xsd).Save("C:\Out\$_") }
Run Code Online (Sandbox Code Playgroud)
但我真正希望能够做的是ForEach-Object
直接使用Group-Object
迭代每个组项,从而消除了对单独$grouping
变量的需要.
我如何使用ForEach-Object
获取键/值对同时保持每个Merge-Xsd
作用域调用到该特定键/值对?
20150224更新:
该Merge-Xsd
选项设置非常简单:
NAME
Merge-Xsd
SYNTAX
Merge-Xsd [-Path] <string[]> [<CommonParameters>]
Run Code Online (Sandbox Code Playgroud)
它实际上只是用于一次性抛出一堆文件并将它们合并为单个输出,这是一个XmlDocument
.(我模拟了输出ConvertTo-Xml
.)
我想你可以像这样嵌套它:
Get-ChildItem -Recurse -Filter *.xsd |
Group-Object -Property Name |
ForEach-Object {
($_.Group.FullName | Merge-Xsd).Save("C:\Out\$($_.Name)")
}
Run Code Online (Sandbox Code Playgroud)
我没有你的cmdlet或文件,但在我的有限测试中,这将有效.
我拿出-AsHash
和-AsString
参数,以便与组对象的返回,我们可以直接处理Group-Object
.
该$_.Group.FullName
比它似乎乍一看更复杂.$_
这里指的是一个单独的组对象,因为我们在一个ForEach-Object
.组对象包含一个名为Name
group的名称的属性,以及一个名为的属性,该属性Group
实际上是组中各个项的集合,因此$_.Group
是一个集合.
从这里,这将是有意义的管道即到ForEach-Object
再次,因为每一个集合中的项目将是一个FileInfo对象,并希望得到FullName
传递给财产Merge-Xsd
.
在这里,我们利用一些powershell魔力.当你指的$c.Property
地方$c
是一个对象的集合Property
属性,你回来是由财产对象的集合.
所以$props = $c.Property
是这样的:
$props = $c | ForEach-Object { $_.Property }
Run Code Online (Sandbox Code Playgroud)
知道了,我们可以$_.Group.FullName
直接管道Merge-Xsd
传递来自组中所有文件的所有全名.
在该上下文中,$_.Name
仍然引用组对象,因此它是组的名称,而不是文件的名称.
归档时间: |
|
查看次数: |
6629 次 |
最近记录: |