PowerShell/CMD 命令将元数据从一组文件映射到不同驱动器中的另一组文件

PowerShell/CMD 命令将元数据从一组文件映射到不同驱动器中的另一组文件

因此,我在一个驱动器(C:\Users\xxxxx\Desktop\new)中拥有一组仅包含 .m4v 文件的文件。

我想将另一个驱动器(S:\new2)中文件夹中文件的元数据复制到“new”文件夹中。“new2”有.mp4 格式的文件,但“new”和“new2”中的文件的文件名完全相同。

我使用 HandBrake 将“new2”中的所有文件从 1080p 转换为 720p,并将它们保存在“new”文件夹中,但是它们都丢失了修改时间和创建时间等元数据。

那么我该怎么做才能传输元数据?我已经看到可以使用 FFmpeg 将元数据从一个文件映射到另一个文件,但我不知道如何处理单独驱动器中的整个文件夹。

ffmpeg -i in.mp4 -i out.mp4 -map 1 -map_metadata 0 -c copy fixed.mp4

上述命令用于在两个文件之间映射元数据。“in”是转换前的文件,“out”是转换后的文件,“fixed”是映射后带有“in”元数据的“out”文件。

任何帮助都非常感谢!我可以使用 powershell 或 cmd 命令。

答案1

未经测试,但我认为这可以解决问题:

$new  = 'C:\Users\xxxxx\Desktop\new'
$new2 = 'S:\new2'
$temp = ( mkdir "$env:tmp\$((Get-Date).Ticks)").FullName

$TroubleShoot = @'
MetaSource: "{0}"
MetaAbsent: "{1}"
Press any key to continue...
'@

Get-ChildItem -Path $new, $new2 -File |
  group BaseName |
  where Count -eq 2 | ForEach{
    $MetaSource = ( $_.Group | ? DirectoryName -eq $new2 ).FullName
    $MetaAbsent = ( $_.Group | ? DirectoryName -eq $new ).FullName
    $MetaFixed  = '{0}\{1}.mp4' -f $temp , $_.Name

    Read-Host ($TroubleShoot -f $MetaSource , $MetaAbsent )

    ffmpeg -i $MetaSource -i $MetaAbsent -map 1 -map_metadata 0 -c copy $MetaFixed
}
Copy-Item $temp\* $new -Force
Remove-Item $temp -Force

此代码从两个目录收集文件信息,然后群组BaseName它们配对。然后我们获取FullName每个文件的,构造目标文件名,并执行ffmpeg命令。创建所有新文件后,它们将被复制到原始文件上,并且临时文件夹将被删除。

相关内容