使用将属性转换为数字类型Measure-Object
的计算属性,可以通过对命令的一次调用来实现。CreationTime
现在-Sum
可以使用它(尽管我们将丢弃 的总和CreationTime
)。
在我们计算完统计数据后,我们转换回[DateTime]
以获取有意义的显示值。
从 PS 7+ 开始,计算的属性可以用作Measure-Object
参数。对于较旧的 PS 版本,我们可以使用它Select-Object
来创建计算属性。
PS 7+ 解决方案
foreach ($path in $pathes){
$stats = Get-ChildItem $path -File -Recurse |
Measure-Object 'Length', { $_.CreationTime.Ticks } -Sum -Minimum -Maximum
# Create the output for one table row
[PSCustomObject]@{
Path = $path
'Size(GB)' = [math]::Round( $stats[0].Sum / 1GB, 2 ) # 2 = number of digits
MinimumCreationTime = [DateTime] [Int64] $stats[1].Minimum
MaximumCreationTime = [DateTime] [Int64] $stats[1].Maximum
}
}
解释:
- 我们在调用中指定了两个属性
Measure-Object
:
- 第一个属性只是
Length
- 第二个属性是一个计算属性,这意味着它通过运行一个小脚本块来获取它的值。脚本块将其转换
CreationTime
为Int64
并将其用作将要测量的值。
- 当为 指定多个属性时
Measure-Object
,它会输出一个数组,其中包含每个属性的对象,其中包含统计信息。
$stats[0]
包含Sum
,Minimum
和Maximum
为Length
属性,我们只取Sum
.
$stats[1]
包含Sum
,Minimum
和Maximum
的CreationTime
属性,我们只取Minimum
和Maximum
。请注意,Measure-Object
产生类型的输出[double]
,所以我们首先必须转换回[Int64]
之前最终转换回[DateTime]
。
PS 5 解决方案
foreach ($path in $pathes){
$stats = Get-ChildItem $path -File -Force |
Select-Object Length, @{ name = 'CreationTimeTicks'; expression = { $_.CreationTime.Ticks } } |
Measure-Object Length, CreationTimeTicks -Sum -Minimum -Maximum
# Create the output for one table row - identical to PS 7+ solution
[PSCustomObject]@{
Path = $path
'Size(GB)' = [math]::Round( $stats[0].Sum / 1GB, 2 ) # 2 = number of digits
MinimumCreationTime = [DateTime] [Int64] $stats[1].Minimum
MaximumCreationTime = [DateTime] [Int64] $stats[1].Maximum
}
}
解释:
这类似于 PS 7+ 的解决方案,不同之处在于我们用于Select-Object
创建一个名为 的计算属性CreationTimeTicks
,因此我们可以将其按名称传递给Measure-Object
调用。
结论
虽然此代码似乎有效,但此答案提供的代码在概念上更清晰,因此我会使用它。