在Powershell中计数,排序和分组

时间:2014-06-20 14:08:52

标签: sorting powershell grouping counting

是否有任何酷的cmdlet可以帮助我执行以下操作? 我想在Powershell中使用与在SQL中执行相同操作一样简单的事情:

  select RootElementName , count(*) from Table
  group by RootElementName 
  order by RootElementName 

我是目录中的所有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 

  }

期望的结果:

RootName   Count 
--------   -----
Root1      15 
MyRoot     16 
SomeRoot   24 

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

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

1 个答案:

答案 0 :(得分:6)

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

$DirectoryName = "d:\MyFolder\"
$AllFiles = Get-ChildItem $DirectoryName -Force | ForEach-Object {
    #The FullName-property contains the aboslute 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
    }
} | Group-Object RootElementName | Sort-Object Name | Select-Object Name, Count

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

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

    #Output rootelementname
    $xmlDoc.SelectSingleNode("/*").Name
} | Group-Object | Sort-Object Name | Select-Object Name, Count