[英]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.