Получить изображение и видео запись даты / времени Powershell - PullRequest
0 голосов
/ 15 марта 2019

У меня есть много частных (не деловых) изображений и видео с нескольких камер, видеокамер и мобильных телефонов.Все эти вещи находятся на моем жестком диске в виде файлов.Имена файлов совершенно разные и несортированные.Мне нужно сделать эти вещи отсортированными и заказанными.Для этой сортировки может использоваться только дата / время записи изображения или видео (не дата / время файла на жестком диске).Мне нужно просто переименовать все файлы и ввести имя файла до существующей даты / времени записи имени в формате "ггггММдд_ЧЧммсс_".Например, от image.jpg до 20150319_220134_image.jpg.Выглядит очень просто.

Step ONE = images.Я иду бросить интернет и нашел полезный пример кода.И написал простой код для переименования файлов изображений в PowerShell.Код прекрасно работает.Не работайте только с изображениями WhatsApp.Похоже, WhatsApp удаляет теги.

[void][reflection.assembly]::LoadWithPartialName("System.Drawing")

$Path = "\\MyServer\MyShare" 

foreach($File in Get-ChildItem -path $Path)
{
    $Image = ""
    try { $Image = New-Object System.Drawing.Bitmap $File.fullName }
#- is it image file?
    catch { $Image = "" ; $ImageDate = "" }
    if ($Image -ne "")
#- it is imge file, get tag
    {
        try { $ImageDate = $Image.GetPropertyItem(36867).value[0..18] }
#- is here image creation date/time tag?
        catch { $ImageDate = "" }
        $Image.Dispose()
    }
    else { write-host "$file is not image file" }
    if ($ImageDate -ne "")
#- if i have tag, convert variable to yyyyMMdd_HHmmss_
    { 
        $DateTaken = ((([System.Text.Encoding]::ASCII.GetString($ImageDate)) `
     -replace " ","_") -replace ":","") + "_"
        $DoSomething = $true
#- is file already renamed before?
        if ($file.Name.Length -gt 16) 
        { if (($file.Name).SubString(0,16) -eq $DateTaken)
           { $DoSomething = $false }
        }
        if ($DoSomething)
#- file not renamed before
        {
            write-host "$file => $($DateTaken + $File.Name)"
            rename-item $File.FullName $($DateTaken + $File.Name)
        }
        else
        { write-host "$file already renamed" }
    }
    else { if ($Image -ne "") { write-host "$file do not have date/time tag" } }
}

Шаг второй = видео.Я еще раз кидаю интернет, но это было не так просто.К несчастью.С примерами Powershell, которые я нашел, я могу получить дату / время создания только из видео, снятых камерой.Ответ должен быть на 208 деталях.

$path = "\\MyServer\MyShare\MyVideo.avi" 
$shell = New-Object -COMObject Shell.Application
$folder = Split-Path $path
$file = Split-Path $path -Leaf
$shellfolder = $shell.Namespace($folder)
$shellfile = $shellfolder.ParseName($file)
0..321 | Foreach-Object { '{0} = {1} = {2} ' -f $_,` 
  $shellfolder.GetDetailsOf($null, $_),`
  $shellfolder.GetDetailsOf($shellfile, $_) }

Вот и все.Не очень удобно.

Тем временем я нашел несколько утилит командной строки с выводом свойств видеофайла.Например, MediaInfo.Я стараюсь использовать его только в целях тестирования.И написал этот код.

$cpath = "\\MyServer\MyShare\Videos"

$cfiles = Get-ChildItem -Path $cpath
$cMediaFile = "\\MyServer\MyShare\MediaInfo.exe" 

foreach ($cfile in $cfiles)
{
    $clogfile = "$($cfile.fullname).txt"
    $cexp = "$cMediaFile  $($cfile.fullname) > $clogfile"
    Invoke-Expression $cexp
    $clines = Get-Content $clogfile
    write-host $cfile.fullname
    foreach ($cline in $clines)
    {
        $DoSomeThing = $False
        if ($cline.Length -ge 13)
        {
            if (($cline.substring(0,13) -eq "Recorded date") -or `
                ($cline.substring(0,12) -eq "Encoded date") -or ` 
                ($cline.substring(0,13) -eq "Mastered date"))
            {
               $DoSomeThing = $True
            }
        }
        if ($DoSomeThing)
        {
          write-host "      $($cline.substring(0,13)) $($cline.substring(43))"
        }
    }
}

Этот код работает, но мне не нравится это решение.Из-за этого внешнего использовать.Сегодня эта утилита работает нормально, но как насчет завтра?Есть ли какое-то простое решение для чтения даты / времени видеофайлов на Powershell без внешних утилит?

СПАСИБО!

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