使用将CreationTime 属性转换为数字类型的计算属性,可以通过一次调用Measure-Object 命令来实现。现在-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
- 第二个属性是calculated property,这意味着它通过运行一个小脚本块来获取它的值。脚本块将
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 调用。
结论
虽然这段代码似乎可以工作,但this answer 提供的代码在概念上更清晰,所以我会采用它。