是否有任何酷的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有关的东西吗?
答案 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