就我个人而言,我真的不喜欢在使用 PowerShell 时使用 for 循环,但是目前我想不出更好的方法来解决这个问题。
以下代码执行以下操作:
- 使用
Sort-Object Date按日期对对象进行排序,以便对象按时间顺序排列
- 使用
Group-Object按服务器和盘符对数据进行分组
- 使用 for 循环遍历每个组 ($_.Group),以便访问前一个对象进行比较
- 在循环内部:
- 如果 $i = 0,则添加没有值的“Diff”属性 (-)
- 剩下的,获取当前对象和前一个对象的大小差异
# BEGIN TEST DATA
$data = @'
Server,Size,Date,Drive
TS-2,1400,02.01.2022,C
TS-1,400,05.02.2022,C
TS-1,2400,05.03.2022,C
TS-2,700,13.02.2022,C
TS-1,100,2022-jan-22 00:00:00,C
'@ | ConvertFrom-Csv | Select-Object *, @{n = 'Date'; e = { $_.date -as [datetime] } } -ExcludeProperty Date
# END TEST DATA
$data | Sort-Object Date |
Group-Object -Property Server, Drive |
ForEach-Object {
for ($i = 0; $i -lt $_.Group.Count; $i++) {
$currentItem = $_.Group[$i]
if ($i -eq 0) {
$currentItem | Add-Member -NotePropertyName 'Diff' -NotePropertyValue '-' -PassThru
}
else {
$previousItem = $_.Group[$i - 1]
$diff = $currentItem.Size - $previousItem.Size
$currentItem | Add-Member -NotePropertyName 'Diff' -NotePropertyValue $diff -PassThru
}
}
} | Format-Table
输出
Server Size Drive Date Diff
------ ---- ----- ---- ----
TS-1 100 C 22.01.2022 00:00:00 -
TS-1 400 C 05.02.2022 00:00:00 300
TS-1 2400 C 05.03.2022 00:00:00 2000
TS-2 1400 C 02.01.2022 00:00:00 -
TS-2 700 C 13.02.2022 00:00:00 -700