AppHandling/Convert-CALExecutionTimeToTimeSpan.ps1

<#
 .Synopsis
  Convert ExectionTime from CAL Test Runner output to System.Duraction
 .Description
  This function converts a string containing a CAL Test Runner ExecutionTime string in english to a System.Duration value
 .Parameter CALExecutionTime
  Execution time string in english as exported in the ExportTestResult XMLPort
 .Example
  Convert-CALExecutionTime -CALExecutionTime "2 minutes 1 second 65 milliseconds"
#>

function Convert-CALExecutionTimeToTimeSpan {
    Param( 
        [string] $CALExecutionTime
    ) 

    $CALExecutionTime = $CALExecutionTime -replace 'hour','/' -replace 'minute',':' -replace 'millisecond', ';' -replace 'second','.' -replace '[^.-;]'
    if (!$CALExecutionTime.Contains('/')) {
        $CALExecutionTime = "0/" + $CALExecutionTime
    }
    if (!$CALExecutionTime.Contains(':')) {
        $idx = $CALExecutionTime.IndexOf('/')
        $CALExecutionTime = $CALExecutionTime.Substring(0,$idx+1) + "0:" + $CALExecutionTime.Substring($idx+1)
    }
    if (!$CALExecutionTime.Contains('.')) {
        $idx = $CALExecutionTime.IndexOf(':')
        $CALExecutionTime = $CALExecutionTime.Substring(0,$idx+1) + "0." + $CALExecutionTime.Substring($idx+1)
    }
    if (!$CALExecutionTime.Contains(';')) {
        $idx = $CALExecutionTime.IndexOf('.')
        $CALExecutionTime = $CALExecutionTime.Substring(0,$idx+1) + "0;" + $CALExecutionTime.Substring($idx+1)
    }
    $CALExecutionTime = $CALExecutionTime.Replace('/',':').Replace('.',':').Replace(';','')
    $a = $CALExecutionTime.Split(':')
    $l = "000"
    ($a.count-1)..0 | % {
        $a[$_] = ([int]::Parse($a[$_])).ToString($l)
        $l = "00"
    }
    [System.TimeSpan]::ParseExact([String]::Join(":", $a), "hh\:mm\:ss\:fff", $null)
}
Export-ModuleMember Convert-CALExecutionTimeToTimeSpan