因此,我想创建一个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-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
语法是否正确-我相信你(