作为一名优秀的Windows系统管理员,我终于开始学习PowerShell了。话虽如此,我不知道我在做什么(惊讶,惊讶)。
我认为在家里远离我的生产环境,在家里玩PowerShell对我来说是一次很好的学习经历。最近,我开始使用FFMPEG将我的所有.mkv文件转换为.mp4,这样我就可以通过Plex更好地回放我的PlayStation 3,并认为这将是一次很好的学习体验。
我一直在运行的命令如下:
ffmpeg -i OldVideoName.mkv -vcodec copy -acodec ac3 OldVideoName.mp4
我想要的是一个PowerShell脚本,它将运行一次,扫描文件夹和.mkv文件的所有子文件夹(Get-ChildItem“。*。mkv”),通过上面的命令将它们转码为.mp4,并使用相同的命名方案将它们放在与.mkv相同的位置。
使用D:\ Videos作为目标目录运行脚本的示例:
D:\ Videos \ home_dvr \ movies \ video1.mkv - > d:\视频\ home_dvr \ video1.mp4 D:\ Videos \ home_dvr \ tv \ video2.mkv - > d:\画\ home_dvr \电视\ video2.mp4
你可以猜到,我无法理解我的生活。这是放弃之前的最新尝试。
$oldvid = Get-ChildItem .\*.mkv -Recurse
$newvid = $oldvid.Name.split(‘.’)[0]; ForEach-Object {
.\ffmpeg.exe -i $oldvid -y -vcodec copy -acodec ac3 $newvid".mp4”
}
任何帮助将不胜感激!
答案 0 :(得分:9)
试试这个:
$oldvids = Get-ChildItem *.mkv -Recurse
foreach ($oldvid in $oldvids) {
$newvid = [io.path]::ChangeExtension($oldvid.FullName, '.mp4')
.\ffmpeg.exe -i $oldvid.FullName -y -vcodec copy -acodec ac3 $newvid
}
$ oldvid是一个.NET FileInfo对象,当需要将其转换为字符串时,它可以只是文件名而不是整个路径。这对于不在当前目录中的文件不起作用。因此,只需使用FullName
属性即可获得完整路径。
答案 1 :(得分:3)
似乎使用当前版本的powershell,行为已经发生了一些变化。 Keith Hill建议的答案不再适用,它需要删除.FullName
才能使用PS 5.1(Build 14393)。
所以目前的答案是:
$oldvids = Get-ChildItem -Filter "*.mkv" -Recurse
foreach ($oldvid in $oldvids) {
$newvid = [io.path]::ChangeExtension($oldvid, '.mp4')
.\ffmpeg.exe -i $oldvid-y -map 0 -c:v copy -c:a ac3 $newvid
}
-c:v -c:a
现在优先于-vcodec
和-acodec
。
如果您想保留所有曲目而不是一个音频和一个视频曲目,则需要-map 0
标记。