Как узнать среднее время из массива в PowerShell
Я ссылаюсь на список, который содержит много данных в виде истекшего времени процесса, и я пытаюсь преобразовать его в формат, в котором я могу найти среднее количество истекшего времени.
Данные выглядят примерно так:
ElapsedTime
0 hours, 1 minutes, 14 seconds
0 hours, 16 minutes, 2 seconds
0 hours, 4 minutes, 0 seconds
0 hours, 11 minutes, 59 seconds
Итак, я импортировал вышеупомянутые данные в переменную и извлек числовые данные, используя эту формулу:
$ElapsedHours, $ElapsedMinutes, $ElapsedSeconds = $TimeElapsed -split ', ' -split ' ' | Select -Index 0,2,4
Оттуда я присваиваю значения переменной и экземпляру New-TimeSpan:
$ElapsedTimeSpanObject = New-TimeSpan -Hours $ElapsedHours -Minutes $ElapsedMinutes -Seconds -$ElapsedSeconds
Это часть, которая становится сложной для меня. Два приведенных выше примера кода выполняются в цикле Foreach, и я уже создал пустой массив. После того, как объект timespan создан, он вставляется в массив и просматривает следующее значение ElapsedTime.
Я хочу найти среднее из общего массива.
Когда я выполняю текущий код, который я имею для попытки найти Среднее, я получаю ошибку. Вот код, который я использую:
$ElapsedTimespanCollection | Measure-Object -Average
Выполнение приведенного выше кода дает мне эту ошибку для каждого объекта в массиве:
Объект измерения: входной объект "00:02:44" не является числовым. В строке:1 символ:30 + $ElapsedTimespanCollection | Measure-Object -Average + ~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo: InvalidType: (00:02:44:TimeSpan) [Measure-Object], PSInvalidOperationException + FullyQualifiedErrorId: NonNumericInputObject,Microsoft.PowerShell.Commands.MeasureObjectCommand
Итак, как мне преобразовать или отформатировать эти измерения времени во что-то, с чем я могу проверить их среднее значение?
2 ответа
Вы можете использовать TimeSpan для преобразования данных в допустимый тип времени, а затем использовать .TotalSeconds
свойство конвертировать hh:mm:ss
Строка в формате времени, вы можете получить общее количество секунд и т. д. Есть дополнительные методы и свойства, которые вы должны здесь использовать, чтобы помочь.
$ElapsedHours, $ElapsedMinutes, $ElapsedSeconds = $TimeElapsed -split ', ' -split ' ' | Select -Index 0,2,4
$ElapsedTimeSpanObject = New-TimeSpan -Hours $ElapsedHours -Minutes $ElapsedMinutes -Seconds -$ElapsedSeconds
## -- $ElapsedTimespanCollection = "00:02:44"
$ElapsedTimespanCollection = [TimeSpan]$ElapsedTimespanCollection
$ElapsedTime.TotalSeconds
Дополнительные ресурсы
свойства
- Seconds: получает компонент секунд интервала времени, представленного текущей структурой TimeSpan.
методы
- Duration(): возвращает новый объект TimeSpan, значение которого является абсолютным значением текущего объекта TimeSpan.
Этот сценарий использует RegEx с (группы захвата) для извлечения часов, минут и секунд из встроенного CSV со строкой здесь. Это создает PSCustomObject из всех данных времени
## Q:\Test\2018\07\03\SU_1336282.ps1
$TimeLapsed = @"
ElapsedTime
0 hours, 1 minutes, 14 seconds
0 hours, 16 minutes, 2 seconds
0 hours, 4 minutes, 0 seconds
0 hours, 11 minutes, 59 seconds
"@ | ConvertFrom-Csv -Delimiter '|'
$Elapsed = ForEach($row in $TimeLapsed) {
if ($row -match '(?<HH>\d+) hours, (?<mm>\d+) minutes, (?<ss>\d+) seconds'){
$TotalSecs = (3600 * $Matches.HH) +
( 60 * $Matches.mm) +
[int]$Matches.ss
[PSCustomObject]@{
Hour = [int]$Matches.HH
Minute = [int]$Matches.mm
Seconds = [int]$Matches.ss
TotalSecs= $TotalSecs
}
}
}
$Elapsed
$Elapsed | Measure TotalSecs -Average -Sum -MAx -Min|ft *
Пример вывода:
> .\SU_1336282.ps1
Hour Minute Seconds TotalSecs
---- ------ ------- ---------
0 1 14 74
0 16 2 962
0 4 0 240
0 11 59 719
Count Average Sum Maximum Minimum Property
----- ------- --- ------- ------- --------
4 498,75 1995 962 74 TotalSecs