在Powershell中计数,排序和分组

Nea*_*ers 3 sorting powershell grouping counting

是否有任何酷的cmdlet可以帮助我做以下事情?我想要Powershell中的东西就像在SQL中做同样简单:

select RootElementName , count(*) from Table
group by RootElementName 
order by RootElementName 
Run Code Online (Sandbox Code Playgroud)

我是目录中的所有XML文件,找到每个XML文件的根元素.

$DirectoryName = "d:\MyFolder\"
$AllFiles = Get-ChildItem $DirectoryName -Force 
foreach ($Filename in $AllFiles) 
{
     $FQFilename = $DirectoryName + $Filename
     [xml]$xmlDoc = Get-Content $FQFilename
     $rootElementName = $xmlDoc.SelectSingleNode("/*").Name; 
     Write-Host $FQFilename $rootElementName 
}
Run Code Online (Sandbox Code Playgroud)

期望的结果:

RootName   Count 
--------   -----
Root1      15 
MyRoot     16 
SomeRoot   24 
Run Code Online (Sandbox Code Playgroud)

我知道我可以创建两个数组,或者一个对象数组,将根元素存储在数组中,并使用典型代码完成所有计数,只是希望这种新语言可能有内置的东西,我没有'发现了.

我可以将"Write-Host $ FQFilename $ rootElementName"传递给与上面提到的SQL有关的东西吗?

Fro*_* F. 7

这是一个解决方案.Group-Object不会将对象写入我们可以排序或分组的管道.Write-Host仅在屏幕上打印文本以向用户显示某些内容,例如.脚本菜单.

$AllFiles | Group-Object RootElementName | Sort-Object Name | Select-Object Name, Count
Run Code Online (Sandbox Code Playgroud)

我正在创建一个具有FileName属性和RootElementName的对象,因此如果需要检索列表的文件名+ rootelement,则可以使用它.如果没有,我们可以将其简化为:

$DirectoryName = "d:\MyFolder\"
$AllFiles = Get-ChildItem $DirectoryName -Force | ForEach-Object {
    #The FullName-property contains the absolute path, so there's no need to join the filename and $directoryname
    [xml]$xmlDoc = Get-Content $_.FullName
    $rootElementName = $xmlDoc.SelectSingleNode("/*").Name

    #Outputing an object that we can group and sort
    New-Object -TypeName psobject -Property @{
        FileName = $_.FullName
        RootElementName = $rootElementName
    }
}
$grped = $AllFiles | Group-Object RootElementName | Sort-Object Name | Select-Object Name, Count
Run Code Online (Sandbox Code Playgroud)