So ermitteln Sie die durchschnittliche Zeit eines Arrays in PowerShell

551
cyborgcommando0

Ich beziehe mich auf eine Liste, die viele Daten in Form der abgelaufenen Zeit eines Prozesses enthält, und ich versuche, diese in ein Format umzuwandeln, in dem ich die durchschnittliche abgelaufene Zeit finden kann.

Die Daten sehen ungefähr so ​​aus:

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 

Also habe ich die obigen Daten in eine Variable importiert und die numerischen Daten mit dieser Formel extrahieren:

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

Von dort weise ich die Werte einer Variablen und einer Instanz von New-TimeSpan zu:

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

Dies ist der Teil, der für mich schwierig wird. Die beiden obigen Codebeispiele finden alle innerhalb einer Foreach-Schleife statt, und ich habe bereits ein leeres Array erstellt. Nachdem das Zeitbereichsobjekt erstellt wurde, wird es in das Array eingefügt und betrachtet den nächsten ElapsedTime-Wert.

Ich möchte den Durchschnitt des gesamten Arrays ermitteln.

Wenn ich den aktuellen Code ausführte, den ich für den Versuch habe, den Durchschnitt zu finden, erhalte ich eine Fehlermeldung. Hier ist der Code, den ich verwende:

$ElapsedTimespanCollection | Measure-Object -Average 

Die Ausführung des obigen Codes führt zu diesem Fehler für jedes Objekt im Array:

Messobjekt: Das Eingabeobjekt "00:02:44" ist nicht numerisch. An Zeile: 1 Zeichen: 30 + $ ElapsedTimespanCollection | Measure-Object -Average + ~~~~~~~~~~~~~~~~~~~~~~ Kategorie-Info: UngültigerTyp: (00: 02: 44: TimeSpan) [Measure-Object], PSInvalidOperationException + FullyQualifiedErrorId: NichtNumericInputObject, Microsoft.PowerShell.Commands.MeasureObjectCommand

Wie kann ich also diese Zeitangaben in etwas umwandeln oder formatieren, in das ich den Durchschnittswert einchecken kann?

1
Zeigen Sie alle Zeiten im gewünschten Array an? Ich bin nur verwirrt, woher die Eingabe 00:02:44 kommt. DrZoo vor 5 Jahren 0
Die 00:02:44 stammt von einem Beispiel für die Art der Fehlermeldungen, die ich mit dem obigen Code bekomme. Ich habe keinen bestimmten Ausschnitt in den ElapsedTime-Daten, aber Sie erhalten ein Bild. Die ElapsedTime-Daten sind ein Beispiel für die Daten, mit denen ich arbeite. cyborgcommando0 vor 5 Jahren 0

2 Antworten auf die Frage

3
Pimp Juice IT

Sie können TimeSpan verwenden, um die Daten in einen gültigen Zeittyp zu konvertieren, und dann die .TotalSecondsEigenschaft, um die hh:mm:ssZeichenfolge in ein Zeitformat zu konvertieren, in dem Sie numerische Gesamtsekunden usw. abrufen können. Es gibt zusätzliche Methoden und Eigenschaften, die Sie hier verwenden sollten Hilfe.

$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 

Weitere Ressourcen

  • TimeSpan-Struktur

    Eigenschaften

    • Sekunden: Ruft die Sekundenkomponente des Zeitintervalls ab, das von der aktuellen TimeSpan-Struktur dargestellt wird.

    Methoden

    • Duration (): Gibt ein neues TimeSpan-Objekt zurück, dessen Wert der absolute Wert des aktuellen TimeSpan-Objekts ist.
cyborgcommando0 - Offensichtlich müssen Sie die Summe der Sekunden berechnen, diese durch die Anzahl der Objekte in der Gruppe teilen, um die durchschnittlichen Sekunden zu erhalten, und diese dann in eine Dauer umwandeln. Für Ihr unmittelbares Problem habe ich ein Beispiel gezeigt, wie Sie die Zeichenfolge 00: 00: 00 in eine Zeitart konvertieren können, um sie dann in einen anderen numerischen Datentyp konvertieren zu können. Gerne weiter helfen, wenn Sie fragen, lassen Sie es mich wissen. Pimp Juice IT vor 5 Jahren 0
Ich habe noch nie "Measure-Object-Average" mit einem Array von "hh: mm: ss" -Saiten oder Zeitdauer für diese Angelegenheit verwendet, aber Sie wissen möglicherweise bereits, wie Sie mit "Measure-Object-Average" einen Durchschnitt erzielen für das Array-Set oder was auch immer. Ich muss zurücktreten, werde aber später einchecken. Pimp Juice IT vor 5 Jahren 0
Du hast mich auf die richtige Spur gebracht. Aus irgendeinem Grund dachte ich, die TotalSeconds-Methode wäre nur Sekunden und nicht Minuten oder Stunden, und ich werde mein Skript für die Vergiftung meines Geistes verantwortlich machen. Ich habe den Code geändert, der jedes TimeSpan-Objekt eingefügt hat: `$ ElapsedTimespanCollection + = $ ElapsedTimeSpanObject.TotalSeconds 'Dann habe ich nur den folgenden Code erstellt und er gibt mir das, was ich brauche. `$ FindElapsedTimeSpanAverage = ($ ElapsedTimespanCollection | Measure-Object -Average) .Al``` $ ElapsedTimeSpanAverageObject = New-TimeSpan - Seconds $ FindElapsedTimeSpanAverage` Vielen Dank cyborgcommando0 vor 5 Jahren 1
0
LotPings

Dieses Skript verwendet ein RegEx mit (Erfassungsgruppen), um Stunden, Minuten und Sekunden aus einer Inline-CSV mit einer Here-Zeichenfolge zu extrahieren. Es erstellt ein PSCustomObject aus allen Zeitdaten

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

Beispielausgabe:

> .\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