因此,我想创建一个 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 中,您可以使用以下命令(您可以将此代码按原样粘贴到 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
cmdlet 获取有关当前目录中扩展名为 (.mkv
) 的所有文件的信息(您可以添加 -File
来明确排除目录,但带有扩展名的目录名称是).
where BaseName -notlike '*`[encoded]'
使用 Where-Object
cmdlet(其内置别名为 where
)来清除基本名称(不带文件扩展名的名称)已以 [encoded]
结尾的文件。请注意开头 `
之前的 [
,以便逐字使用它,因为 [
在 PowerShell 的 通配符表达式中具有特殊含义,
-like
/ -notlike
运算符对其进行操作。
foreach { ... }
使用
ForEach-Object
cmdlet(其内置别名为
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
语法是否正确 - 我相信你)