批处理文件:删除编号顺序中的最后一个文件



我正在使用 sox http://sox.sourceforge.net/编写一个 Windows 批处理脚本,以根据静音将装满波形文件的文件夹拆分为单独的波形文件(每个文件中有多个不同的声音。

FOR %%f in (*.wav) do (
sox %%f %%f silence 1 0.1 1%% 1 2.5 1%% : newfile : restart)

换句话说,该文件夹包含 01.wav、02.wav 等和 SOX 输出 01001.wav 01002.wav、02001.wav、02002.wav 等。由于 sox 循环遍历 wav 文件的方式,我最终为每个原始文件多了一个文件,而不是我应该拥有的文件。我想在我的脚本末尾添加一个循环,用于确定每个初始两位指示符 (01、02、03( 存在多少个文件并删除最后一个。

如果我需要解释这一点,或者使用不同的脚本语言是否会更容易,请告诉我。我看到有人在perl中做类似的事情,但我还没有研究过在perl中编辑wav文件。

谢谢

for %%f in (*.wav) do (
    sox %%f %%f silence 1 0.1 1%% 1 2.5 1%% : newfile : restart
    set "last=1"
    for /f "delims=" %%a in ('
        dir /a-d /b /o-n "%%~nf*.wav"
    ') do if defined last if not "%%a"=="%%f" ( set "last=" & del "%%a" )
)

对于每个已处理的输入文件,将按名称降序生成具有相同名称的.wav文件的列表。此列表将包含最后生成的文件(在相关命名之后(作为第一个元素,因此,将删除第一个元素(集合中的最后一个文件(。包括附加检查以确保不会删除原始输入文件(以防以前的文件处理未生成任何附加文件(。

setlocal EnableDelayedExpansion
for %%f in (*.wav) do (
   sox %%f %%f silence 1 0.1 1%% 1 2.5 1%% : newfile : restart
   rem Get the last file with this same name plus three digits:
   for %%g in (%%~Nf???.wav) do set "last=%%g"
   del "!last!"
)

相关内容

最新更新