如何为ffmpeg创建powershell脚本/或windows.bat文件



因此,我想创建一个Powershell或Batch文件(最适合任务的文件(,我可以将其粘贴到文件夹中,执行后,将开始使用FFmpeg对所有视频进行编码

工作的部分(在.bat中(:

for %%a in ("*.mkv") do(
ffmpeg -i "%%a" -c:v libx265 -c:a copy -x265-params crf=25 "%%a [encoded].mkv"
pause)

这是可行的,但在一些文件夹中,我已经有了[编码]文件。我希望脚本跳过这些文件。我在reddit上询问并收到了以下脚本:

for %%a in ("*.mkv") do (
if not exist "%%a [encoded].mkv" ffmpeg -i "%%a" -c:v libx265 -c:a copy -x265-params crf=25 "%%a [encoded].mkv"
pause)

我尝试了这个脚本,但每个文件都被编码了,即使其中有[编码的]。在我指出这一点后,他们告诉我,我可能应该切换到PowerShell,并提供了一个StackOverflow问题的链接:

您可能需要切换到PowerShell查找不包含选定字符串的文件然后在返回的内容中执行foreach,在其上执行ffmpeg命令

但我不知道如何在PowerShell中编码(以前从未使用过(.bat文件能用吗?如果是,我该怎么写?如果PowerShell脚本是更好的选择,我将如何对其进行编码?

感谢您的帮助和回答。

PowerShell中,您可以使用以下代码(您可以将此代码原样粘贴到PowerShell控制台窗口中(:

Get-ChildItem *.mkv | where BaseName -notlike '*`[encoded]' | foreach {
ffmpeg -i $_ -c:v libx265 -c:a copy -x265-params crf=25 "$($_.BaseName) [encoded].mkv"
pause
}
  • Get-ChildItem *.mkv使用Get-ChildItem来获取当前目录中所有扩展名为(.mkv(的文件的信息(可以添加-File来明确排除目录,但扩展名为的目录名是(。

  • where BaseName -notlike '*`[encoded]'使用Where-Objectcmdlet(其内置别名为where(剔除基本名称(不带文件扩展名的名称(已以[encoded]结尾的文件。请注意打开[之前的`,以便逐字逐句地使用它,因为[在PowerShell的通配符表达式中具有特殊含义,-like/-notlike运算符对其进行操作。

  • foreach { ... }使用ForEach-Objectcmdlet(其内置别名为foreach(为每个感兴趣的文件调用ffmpeg

    • 在脚本块({ ... }(内部,自动$_变量指的是手头的管道(|(输入对象,在这种情况下,它是表示输入文件的System.IO.FileInfo实例。

    • "$($_.BaseName) [encoded].mkv"使用可扩展字符串(字符串插值(通过输入文件的基本名称($_.BaseName(导出输出文件名。

%%a已经是完整的文件名(包括[encoded](,所以您的if无法工作
我建议另一种方法:

for %%a in ("*.mkv") do (
echo %%a|findstr /iel "[encoded].mkv" >nul || ffmpeg -i "%%a" -c:v libx265 -c:a copy -x265-params crf=25 "%%~na [encoded].mkv"
pause
)

(我没有检查ffmpeg语法是否正确-我相信你(

最新更新