Powershell: Select-Object с дополнительным вычисленным значением разницы - PullRequest
1 голос
/ 30 апреля 2010

Позвольте мне объяснить мой вопрос. У меня есть ежедневный отчет о свободном месте на одном компьютере, как в текстовом файле (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 для предыдущей строки. Не уверен, возможно ли это и как?

1 Ответ

2 голосов
/ 01 мая 2010

Я думаю, что это должно работать. Я просто развернул его в один цикл, где мы отслеживаем последнее значение и используем его для создания свойства 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...