代码之家  ›  专栏  ›  技术社区  ›  David.Chu.ca

Powershell:选择具有其他计算差值的对象

  •  1
  • David.Chu.ca  · 技术社区  · 16 年前

    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对象的结果中添加额外的计算值,或者通过管道将结果传递到另一个Select对象,并将计算作为附加属性或列。为此,我需要获取前一行的FreeSpace值。不确定是否可能以及如何实现?

    1 回复  |  直到 16 年前
        1
  •  2
  •   zdan    16 年前

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

    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
    
    推荐文章