簡體   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