我有很多私密(非商业)的图像和视频,来自一些相机,摄录机和手机。所有这些东西都作为文件位于我的硬盘上。文件名完全不同且未排序。我需要对这些项目进行排序和排序。只能用于此分类作业的是图像或视频记录的日期/时间(而不是硬盘上文件的日期/时间)。我只需要重命名所有文件并以“ 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上录制视频文件的日期/时间?
谢谢!