获取图像和视频录制日期/时间Powershell

时间:2019-03-15 15:06:29

标签: powershell datetime recording

我有很多私密(非商业)的图像和视频,来自一些相机,摄录机和手机。所有这些东西都作为文件位于我的硬盘上。文件名完全不同且未排序。我需要对这些项目进行排序和排序。只能用于此分类作业的是图像或视频记录的日期/时间(而不是硬盘上文件的日期/时间)。我只需要重命名所有文件并以“ yyyyMMdd_HHmmss_”格式在现有名称记录日期/时间之前放入文件名。例如,将image.jpg更改为20150319_220134_image.jpg。看起来很简单。

第一步=图片。 我去上网,找到了可用的代码示例。并编写了用于在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示例,我只能从相机拍摄的avi视频中获得创建日期/时间。答案应该在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上录制视频文件的日期/时间?

谢谢!

0 个答案:

没有答案