这是我的代码:
$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”有关,因为如果我删除它有效,但我需要导航到该文件夹,因为那是文件的位置。
答案 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次,它会获得相同的数据。