【问题标题】:Powershell: Select-Object with additional calculated difference valuePowershell:具有附加计算差异值的选择对象
【发布时间】:2010-04-30 17:38:31
【问题描述】:

让我解释一下我的问题。我有一份关于一台 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 会返回一个对象的集合。在这里,我从输入文本文件创建此集合(将每一行解析为部分:日期时间和空闲空间(MB))。

为了计算日期之间的差异,我想我需要在最后一个 Select-Object 的结果中添加额外的计算值,或者将结果通过管道传递给另一个 Select-Object,并将计算作为附加属性或列。为了做到这一点,我需要获取前一行的 FreeSpace 值。不确定是否可行以及如何实现?

【问题讨论】:

    标签: powershell


    【解决方案1】:

    我认为这应该可行。我只是将它展开到一个循环中,我们在其中跟踪最后一个值并使用它在选择表达式中创建更改属性。我还稍微更改了解析代码,因此您不依赖硬编码的子字符串长度。它还有助于使选择表达式更易于编写和理解。

    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
    

    【讨论】:

    • 在这里快速评论,为了让我的问题简单,我只使用日期时间作为日期。实际值是日期和时间,因此日期、时间和上午/下午之间有一个空格,例如“03/01/2010 02:34:00 AM”。无论如何,我会试一试并消化您的解决方案。谢谢@zdan!
    • 如何将更改值格式化为 '0:N2' -f 之类的格式,即小数点后 2 位?有些值就像 0.18223233。我希望更改值为 0.18。
    • 要将结果格式化为两位数的值,只需使用 $v 等临时变量将值保存在 if 和 else 中,然后返回 '{0:N2}' -f $v if else 块结束。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-04
    • 1970-01-01
    • 2018-07-30
    • 2015-04-07
    • 2015-08-23
    • 1970-01-01
    相关资源
    最近更新 更多