У меня есть много частных (не деловых) изображений и видео с нескольких камер, видеокамер и мобильных телефонов.Все эти вещи находятся на моем жестком диске в виде файлов.Имена файлов совершенно разные и несортированные.Мне нужно сделать эти вещи отсортированными и заказанными.Для этой сортировки может использоваться только дата / время записи изображения или видео (не дата / время файла на жестком диске).Мне нужно просто переименовать все файлы и ввести имя файла до существующей даты / времени записи имени в формате "ггггММдд_ЧЧммсс_".Например, от 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 без внешних утилит?
СПАСИБО!