Значения длительности суммы Пауэршела - PullRequest
1 голос
/ 17 июня 2020

Я создал [pscustomobject] только со свойствами, которые меня интересуют. Теперь мне нужно просуммировать некоторые значения, которые представляют время. Я пытаюсь, но ничего не возвращает. Я делаю что-то не так, но не могу понять.

 function Convert-TimeString ([String]$Time, [String[]]$Format)
 {
  $result = New-Object TimeSpan

  $convertible = [TimeSpan]::TryParseExact(
  $Time,
  $Format,
  [System.Globalization.CultureInfo]::InvariantCulture,
  [ref]$result)

  if ($convertible) { $result.ToString('hh\:mm\:ss\.fff')}
}


$allMediaFiles = Get-ChildItem -Path C:\Users\User\Documents\ScripsPS1\xip\Testes\*   | % {
$content = get-content -Path $_ -Raw
$xml = [xml]$content


    [pscustomobject]@{
    video_audio = $xml.XIP.ContentObject.CustomType # video of audio
    SecurityTag = $xml.XIP.ContentObject.SecurityTag 
    Duration = ($xml.XIP.Generation.Properties.Property | where {$_.PropertyName -eq "Duration"}).value
    Format = $xml.XIP.Bitstream.Filename -replace ".*\.", ""
}

Когда я бегу:

  $allMediaFiles | FT 

Я получаю такой результат:

video_audio SecurityTag    Duration  Format
----------- -----------    --------  ------
video       U_UserAccess   2M9.686S  mp4   
video       U_UserAccess   2M37.526S mp4   
video       U_UserAccess   5M41.419S mp4   
document    LOADING_BAY_10           eaf   
document    LOADING_BAY_10           eaf   
document    LOADING_BAY_10           eaf   
audio       LOADING_BAY_10 0:11:19   WAV   
audio       LOADING_BAY_10 0:03:24   WAV   
audio       LOADING_BAY_10 0:03:37   WAV   
audio       LOADING_BAY_10 0:23:39   WAV   
document    LOADING_BAY_10           eaf   
document    LOADING_BAY_10           eaf     
audio       LOADING_BAY_10 0:16:46   wav 

Мой код для попытки преобразовать и суммировать «Продолжительность»:

 $allMediaFiles | ? {$_.video_audio -eq "video"} | Group-Object -Property Duration | Select Name | if ($_.Duration -match "M"){ Convert-TimeString -Time $_.Duration -Format 'm\Ms\.fff\S'}
 else {Convert-TimeString -Time $_.Duration -Format "h\:mm\:ss"}}

Спасибо за любую помощь.

1 Ответ

1 голос
/ 17 июня 2020

Вы не можете подключиться к оператору If, что является основной проблемой, с которой вы столкнулись в последней части вашего вопроса.

Вот что, я думаю, дает вам результат, который вы ищете:

Приведенный ниже цикл просматривает все видео результаты вашего объекта с использованием ForEach-Object. Затем он использует вашу функцию Convert-TimeString для преобразования значений длительности каждого элемента в коллекции в строковый формат, который затем может быть преобразован в тип [timestamp].

$allMediaFiles | Where-Object { $_.video_audio -eq "video" } | ForEach-Object { 

    if ($_.Duration -match "M") { 
        $_.Duration = [TimeSpan](Convert-TimeString -Time $_.Duration -Format 'm\Ms\.fff\S')
    }
    else {
        $_.Duration = [TimeSpan](Convert-TimeString -Time $_.Duration -Format "h\:mm\:ss")
    }

}

В следующем примере используется Measure-Object суммировать свойство TotalSeconds свойств типа now [timestamp] в вашей коллекции, которое возвращает как целое общее значение общих миллисекунд для ваших длительностей. Чтобы вернуть их в формат времени, мы используем New-TimeSpan для этого результата:

$Result = New-TimeSpan -Seconds ($allMediaFiles.Duration | Measure-Object -Property TotalSeconds -Sum).Sum

Затем, чтобы отобразить как чч: мм: сс, мы можем просто использовать .tostring(), чтобы снова превратить его в строка:

$Result.ToString()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...