我创建了一个批处理文件,它将读取文件夹中的音频,规范化音频的 LUFS,并在同一文件夹中以修改后的名称生成输出音频,同时保留原始文件。
我用来生成规范化文件(不使用复制)的命令是,在同一个文件夹中使用另一个名称:
"..\Áudios LUFS\!filename!_LUFS_!vLUF!.flac"
例如。
Original file : Music.flac
Normalized file: Music_LUFS_-10.0.flac
注意。我使用变量“vLUF”来组成规范化文件的名称。
事实证明,如果我再次运行该命令,Music_LUFS_-10.0.flac 文件将保留在文件夹中,并会创建一个新文件。
例如。
Music_LUFS_-10.0_LUFS_-10.0.flac
因此文件夹中有两个内容相同但名称不同的文件:
Music_LUFS_-10.0.flac
Music_LUFS_-10.0_LUFS_-10.0.flac
我正在尝试更改批处理文件,以便如果文件夹中已经存在同名文件,它就不会保存该文件,但我遇到了一些困难和疑问。
批处理文件已更改,以避免在文件夹中已存在同名文件时保存文件。
批处理开始时,我定义了变量,但 FOR 命令中的变量没有在 ECHO 中显示值,只有在 FOR 之外定义的变量才正确显示值:
@echo off
chcp 65001
cls
ENDLOCAL
SETLOCAL ENABLEEXTENSIONS
cd\Users\%username%\Desktop\Áudios LUFS
SET vLUF=-10.0
SET vPEAK=-0.5
SET previousfile=""
FOR %%a IN (*.flac) DO (
SET "file=%%a"
SET "filename=%%~na"
ECHO %file% CURRENT READ FILE
ECHO %filename% JUST NAME CURRENT READ FILE
ECHO %vLUF% LUF VALEU
ECHO %vPEAK% PEAK VALUE
ECHO %previousfile% PREVIOUS FILE
下面是变量中包含 ECHO 的终端屏幕。请注意,只有在 FOR 之外定义的变量才能正确显示其值:
下面,在 FOR 内部比较 IF,当文件已存在于文件夹中时不生成该文件。最后请注意,在 FOR 读取下一个文件之前,我尝试使用生成的文件的名称更新“previousfile”变量:
If "%file%" NEQ "%previousfile%" (
ffmpeg -hide_banner -i "%%a" -af "[0:a]loudnorm=print_format=summary" -f null NUL 2> "%%~na.log"
@FOR /F "tokens=3" %%b IN ('FINDSTR /C:"Input Integrated" "%%~na.log"') DO (SET II=%%b)
@FOR /F "tokens=4" %%b IN ('FINDSTR /C:"Input True Peak" "%%~na.log"') DO (SET ITP=%%b)
@FOR /F "tokens=3" %%b IN ('FINDSTR /C:"Input LRA" "%%~na.log"') DO (SET ILRA=%%b)
@FOR /F "tokens=3" %%b IN ('FINDSTR /C:"Input Threshold" "%%~na.log"') DO (SET IT=%%b)
@FOR /F "tokens=3" %%b IN ('FINDSTR /C:"Target Offset" "%%~na.log"') DO (SET TO=%%b)
DEL "%%~na.log"
SETLOCAL ENABLEDELAYEDEXPANSION
ECHO !II! Input Integrated
ECHO !ITP! Input True Peak
ECHO !ILRA! Input LRA
ECHO !IT! Input Threshold
ECHO !TO! Target Offset
FOR /F "tokens=1,2 delims=," %%b IN ('ffprobe -v 0 -select_streams a -show_entries "stream=sample_fmt,sample_rate" -of "csv=p=0" "!filename!.flac"') DO (
ffmpeg -hide_banner -y -i "!filename!.flac" -af "loudnorm=linear=true:I=!vLUF!:LRA=11:tp=!vPEAK!:measured_I=!II!:measured_LRA=!ILRA!:measured_tp=!ITP!:measured_thresh=!IT!:offset=!TO!:print_format=summary" -c:v copy -id3v2_version 3 -metadata:s:v title="Album cover" -metadata:s:v comment="Cover (front)" -map 0:0 -c:a flac -sample_fmt:a %%b -ar:a %%c "..\Áudios LUFS\!filename!_LUFS_!vLUF!.flac"
SET "previousfile=!filename!_LUFS_!vLUF!.flac"
)
)
ENDLOCAL
)
注意:在我用来生成输出文件的命令中,"..\Áudios LUFS\!filename!_LUFS_!vLUF!.flac"
是否有任何参数可以替换文件夹中已存在的文件而不是用其他名称创建?
答案1
我认为你把这件事弄得太复杂了,只需跳过已经有的文件即可卢夫斯在 for 的名称里面。
代替:
FOR %%a IN (*.flac) DO (
你用:
for /f "delims=" %%a in ('dir /b *.flac ^|find /v /i "_LUFS_"') do (