让我解释一下我的问题。我有关于一个PC的可用空间的每日报告,如文本文件(sp.txt)中所示:
DateTime FreeSpace(MB)
----- -------------
03/01/2010 100.43
DateTime FreeSpace(MB)
----- -------------
03/02/2010 98.31
....
然后我需要使用此文件作为输入来生成日期之间可用空间不同的报告:
DateTime FreeSpace(MB) Change
----- ------------- ------
03/01/2010 100.43
03/02/2010 98.31 2.12
....
以下是我必须获得的一些代码,而无需额外的“更改”计算:
Get-Content "C:\report\sp.txt" `
| where {$_.trim().length -gt 0 -and -not ($_ -like "Date*") -and -not ($_ -like "---*")} `
| Select-Object @{Name='DateTime'; expression={[DateTime]::Parse($_.SubString(0, 10).Trim())}}, `
@{Name='FreeSpace(MB)'; expression={$_.SubString(12, 12).Trim()}}, `
| Sort-Object DateTime `
| Select-Object DateTime, 'FreeSpace(MB)' |ft -AutoSize # how to add additional column Change to this Select-Object?
我的理解是Select-Object将返回一组对象。在这里,我从输入文本文件创建此集合(将每行解析为部分:datetime和freespace(MB))。
为了计算日期之间的差异,我想我需要在最后一个Select-Object的结果中添加额外的计算值,或者将结果通过计算作为附加属性或列传递给另一个Select-Object。为了做到这一点,我需要获得前一行的FreeSpace值。不确定是否可能以及如何?
答案 0 :(得分:2)
我认为这应该有效。我只是将它展开到一个循环中,我们跟踪最后一个值并使用它在select表达式中创建change属性。我还稍微更改了解析代码,因此您不依赖于硬编码的子字符串长度。它还有助于使选择表达式更易于编写和理解。
Get-Content "sp.txt" `
| where {$_.trim().length -gt 0 -and -not ($_ -like "Date*") -and -not ($_ -like "---*")} `
| %{
$row = (-split $_ );
$obj = select-object -input $row -prop @{Name='DateTime'; expression={[DateTime]($row[0]);};} , `
@{Name='FreeSpace(MB)'; expression={[Double]($row[1]);} }, `
@{Name='Change'; expression={if($last){$row[1]-$last.'FreeSpace(MB)'}else{0}}};
$last = $obj;
$obj;
} | sort DateTime | ft -autosize