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

问题描述 投票:0回答:2

因此,我想创建一个 Powershell 或批处理文件(以最适合该任务的方式为准),我可以将其粘贴到文件夹中,执行后,将开始使用 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 batch-file ffmpeg
2个回答
2
投票

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
}

1
投票
%%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

语法是否正确 - 我相信你)

    

© www.soinside.com 2019 - 2024. All rights reserved.