Como encontrar o tempo médio de uma matriz no PowerShell


1

Estou fazendo referência a uma lista que possui muitos dados na forma do tempo decorrido de um processo e estou tentando convertê-los em um formato em que possa encontrar a quantidade média de tempo decorrido.

Os dados são mais ou menos assim:

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

Então, eu tenho os dados acima Importados em uma variável e extraia os dados numéricos usando esta fórmula:

$ElapsedHours, $ElapsedMinutes, $ElapsedSeconds = $TimeElapsed -split ', ' -split ' ' | Select -Index 0,2,4

A partir daí, atribuo os valores a uma variável e a uma instância do New-TimeSpan:

$ElapsedTimeSpanObject = New-TimeSpan -Hours $ElapsedHours -Minutes $ElapsedMinutes -Seconds -$ElapsedSeconds

Essa é a parte que fica mais complicada para mim. Os dois exemplos de código acima estão ocorrendo em um loop Foreach e eu já criei uma matriz em branco. Depois que o objeto de intervalo de tempo é criado, ele é inserido na matriz e examina o próximo valor ElapsedTime.

Eu quero encontrar a média da matriz total.

Quando executo o código atual que tenho para tentar encontrar a Média, recebo um erro. Aqui está o código que estou usando:

$ElapsedTimespanCollection | Measure-Object -Average

A execução do código acima me dá esse erro para cada objeto na matriz:

Objeto de medida: o objeto de entrada "00:02:44" não é numérico. Na linha: 1 caractere: 30 + $ ElapsedTimespanCollection | Measure-Object -Average + ~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo: InvalidType: (00: 02: 44: TimeSpan) [Objeto de medida], PSInvalidOperationException + FullyQualifiedErrorId: NonNumericInputObject, Microsoft.PowerShell.Commands.MeasureObjectCommand

Então, como faço para converter ou formatar essas medidas de tempo em algo que eu possa comparar em relação à sua média?


Você está mostrando todas as vezes na matriz que deseja? Estou confuso de onde vem a entrada 00:02:44.
DrZoo

00:02:44 vem de um exemplo do tipo de mensagem de erro que estou recebendo com o código acima. Não tenho esse trecho específico nos dados ElapsedTime, mas você entendeu. Os dados ElapsedTime são um exemplo dos dados com os quais estou trabalhando.
precisa saber é o seguinte

Respostas:


3

Você pode usar o TimeSpan para converter os dados em um tipo de horário válido e, em seguida, usar a .TotalSecondspropriedade para converter a hh:mm:ssseqüência de caracteres em um formato de horário, para obter o total numérico de segundos, etc. Existem métodos e propriedades adicionais que você deve utilizar aqui para Socorro.

$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

Recursos adicionais

  • Estrutura TimeSpan

    Propriedades

    • Segundos: obtém o componente de segundos do intervalo de tempo representado pela estrutura atual TimeSpan.

    Métodos

    • Duration (): retorna um novo objeto TimeSpan cujo valor é o valor absoluto do objeto TimeSpan atual.

cyborgcommando0 - Obviamente, você terá que calcular a soma dos segundos, depois dividir isso pelo número de objetos no conjunto para obter a média de segundos e depois convertê-lo novamente para uma duração. Para o seu problema imediato, mostrei um exemplo de como converter de string 00:00:00para um tipo de hora para poder converter para outro tipo de dados numérico e tal. Fico feliz em ajudar ainda mais se você perguntar, então me avise.
Pimp Juice IT

Eu nunca usei Measure-Object -Averagecom uma matriz de hh:mm:ssseqüências de caracteres ou com duração de tempo para esse assunto, mas você já deve saber como Measure-Object -Averagerecuperar uma média para o conjunto de matrizes ou qualquer outra coisa. Eu tenho que me afastar, mas vou fazer o check-in mais tarde.
Pimp Juice IT

1
Você me colocou no caminho certo. Por alguma razão, eu estava pensando que o método TotalSeconds era apenas segundos e não minutos ou horas e vou culpar meu script por envenenar minha mente. Alterei o código inserindo cada Objeto TimeSpan para isso: $ElapsedTimespanCollection += $ElapsedTimeSpanObject.TotalSeconds Depois, fiz o código abaixo e ele me fornece o que eu preciso. $FindElapsedTimeSpanAverage = ($ElapsedTimespanCollection | Measure-Object -Average).Average $ElapsedTimeSpanAverageObject = New-TimeSpan -Seconds $FindElapsedTimeSpanAverage Graças
cyborgcommando0

0

Este script usa um RegEx com (grupos de captura) para extrair horas, minutos e segundos de um csv embutido com uma string here. Ele cria um PSCustomObject a partir de todos os dados de tempo

## 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 *

Saída de amostra:

> .\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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.