伯爵&文件夹中的平均文件

时间:2015-12-10 16:37:48

标签: powershell foreach directory powershell-v3.0 powershell-ise

这是我的代码:

$folders = gci C:\NuGetRoot\NugetServer -Directory
foreach ($folder in $folders) {
    @{ServerName=$env:COMPUTERNAME;
        ProjectGroupID = $folder.Name;
        NuGetPackageCount = (gci $folder.FullName\Packages -Include '*.txt') | %{$_.Size}.Count;
        AverageSize = gci $folder.FullName -Recurse -Filter *.txt | measure-object -property length -average;
    } | Export-Csv -Path d:\monitoring\NugetStatistics -NoTypeInformation -Append
}

我循环遍历C:\ NuGetRoot \ NugetServer中的文件夹,然后在每个文件夹的'packages文件夹中显示服务器名称,文件夹名称(ProjectGroupID),以.nupkg结尾的文件的包数,以及平均值每个文件夹的“packages”文件夹中包含的所有文件的大小。服务器名称和ProjectGroupID正确显示。计数和平均值不是。我收到错误:

gci : Second path fragment must not be a drive or UNC name. Parameter name:
path2
At line:5 char:30
+ NuGetPackageCount = (gci $folder.FullName\packages -Include '*.nupkg') | ...
+                      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (D:\apps\nuget.ciodev.accenture.com:String) [Get-ChildItem], ArgumentException
    + FullyQualifiedErrorId : DirArgumentError,Microsoft.PowerShell.Commands.GetChildItemCommand*

我认为它与“\ packages”有关,因为如果我删除它有效,但我需要导航到该文件夹​​,因为那是文件的位置。

1 个答案:

答案 0 :(得分:0)

不是像你一样运行Get-ChildItem 3次,你可以为所有* .nupkg文件运行一次,按照它们关联的项目对它们进行分组,并且分组对象将拥有你想要的大部分信息那里。考虑这个替代方案:

$BasePath = "C:\NuGetRoot\NugetServer"
$folders = gci "$BasePath\*\Packages\..\*.nupkg" -Recurse
$(foreach ($folder in $folders|group @{e={$_.fullname.split('\')[0..3] -join '\'}}) {
    [pscustomobject]@{
        ServerName=$env:COMPUTERNAME
        ProjectGroupID = Split-Path $folder.Name -Leaf
        NuGetPackageCount = $folder.group.Where({$_.Directory -match 'Packages'}).count
        AverageSize = $folder.Group | measure-object -property length -average | Select -Expand Average
    }
}) | Export-CSV d:\monitoring\NugetStatistics -NoType -Append

我必须在Count系列的RegEx匹配上有点创意,以确保我只在Packages文件夹中找到了东西,但它的工作正常。我创建了一组测试文件:

C:\Temp\Test\ProjectA\Packages\File2.nupkg
C:\Temp\Test\ProjectA\Packages\File3.nupkg
C:\Temp\Test\ProjectA\File1.nupkg
C:\Temp\Test\ProjectA\File2.nupkg
C:\Temp\Test\ProjectA\File3.nupkg
C:\Temp\Test\ProjectB\Packages\File2.nupkg
C:\Temp\Test\ProjectB\Packages\File3.nupkg
C:\Temp\Test\ProjectB\File1.nupkg
C:\Temp\Test\ProjectC\Packages\File2 - Copy.nupkg
C:\Temp\Test\ProjectC\Packages\File2.nupkg
C:\Temp\Test\ProjectC\Packages\File3 - Copy.nupkg
C:\Temp\Test\ProjectC\Packages\File3.nupkg
C:\Temp\Test\ProjectC\File1.nupkg
C:\Temp\Test\ProjectC\File3.nupkg

当我针对C:\ Temp \ Test的$BasePath运行上述脚本时,我得到了以下结果:

ServerName     ProjectGroupID NuGetPackageCount      AverageSize
----------     -------------- -----------------      -----------
MININT-BMOSR3C ProjectA                       2            161.2
MININT-BMOSR3C ProjectB                       2 155.333333333333
MININT-BMOSR3C ProjectC                       4 157.666666666667

我确实想指出你对Packages文件夹运行Count,但你对整个文件夹运行AverageSize。如果您只希望Packages文件夹中的文件为平均值,则可能需要将Count行中的.Where()语句添加到Average行。

这应该可以加快速度,因为它只运行一次Get-ChildItem,而不是一次,然后每个文件夹再运行2次,它会获得相同的数据。