【问题标题】:Batch convert .wav files to .mp3 files through sub-directories then delete the remaining .wav files通过子目录将 .wav 文件批量转换为 .mp3 文件,然后删除剩余的 .wav 文件
【发布时间】:2016-11-22 17:54:21
【问题描述】:

我在一个广播电台工作,我们使用一个名为 Skimmer Plus 的程序进行音频记录,该程序从我们的父目录“Air Check”创建多个子目录,目录树如下所示(降序):

空气检查
年份(所以现在应该是 2016 年)
月份(11 月)
第(22)天

并且.wav文件保存在Day目录中,但是没有任何其他目录保存文件,只是在“Day”目录中。

我正在努力首先将 .wav 文件自动转换为 .mp3 文件。现在我只使用lame dropper“lamedropXPd3-64.exe”,但我也下载了“lame.exe”,如果这样可以更容易使用的话。这是我尝试使用自动转换的代码:

@echo off
PushD for %%i in (*.wav) do "\\wideorbit.byui.edu\d\Radio Productions\Air Check\2016\November\22" -V 6 --vbr-old --resample 22.05 "%%i" "%%~ni.mp3" & PopD
pause

我得到的错误信息是:“文件名、目录名或卷标语法不正确。”

这是我的第一个问题。

第二个问题(删除剩余的 .wav 文件以节省空间)我离工作更近了。这是我的代码:

@echo off
PushD "\\wideorbit.byui.edu\d\Radio Productions\Air Check\2016\November\22" &&(forfiles -m *.wav* -d -0 -c "cmd /c del /s /q @path") & PopD
pause

这可以删除所有文件,但正如您所见,它只会影响那天。我希望它从这里开始工作:

@echo off
PushD "\\wideorbit.byui.edu\d\Radio Productions\Air Check\" &&(forfiles -m *.wav* -d -0 -c "cmd /c del /s /q @path") & PopD
pause

但是当我尝试运行它时,我收到以下错误消息: “错误:没有找到符合指定搜索条件的文件。”

我可以对代码的两个部分进行哪些更改以使其完全可操作?

(另外,我将@echo offpause 放在那里以便于测试,当我一起完成最终程序时,我会将它们取出)。

谢谢!

【问题讨论】:

  • 我将开始构建用于转换单个 .wav 文件的命令行;之后,我会环绕一个 for /R 循环来处理整个目录树(这就是我认为你想要的);最后,我会在转换工具(lame)之后在循环中插入一个del 命令,以便仅在转换成功的情况下执行(我猜lame 返回一个非零退出代码/@987654332 @以防出错)...

标签: batch-file audio


【解决方案1】:

为了汇总一些不错的技巧,这批将默认扫描当前文件夹中的 .wav 文件。但是有可选的命令行参数可以从Base/FullScan 或当前的/Year/Month 向下扫描整个树。

Lame 和 Del 命令只有 Echoed,只要两个 echo 命令位于倒数第二行。

:: Wav2mpg.cmd
@Echo off & SetLocal EnableExtensions EnableDelayedExpansion
Set Lame="X:\Path\to\your\lame.exe"
Set LameOpts= -V 6 --vbr-old --resample 22.05
Set "Base=\\wideorbit.byui.edu\d\Radio Productions\Air Check"

:: Get current Date
For /f "tokens=1-3 delims=.+-" %%A in (
  'wmic os get LocalDateTime^|findstr ^^[0-9]'
) do Set _DT=%%A
Set "year=%_DT:~0,4%"&Set "Month=%_DT:~4,2%"&Set "Day=%_DT:~6,2%"
:: Strip leading zero from Month, Get Monthname
set /a Mo=100%Month%%%100
For /f "tokens=%Mo%" %%A in (
  'echo/January February March April May June^
   July August September October November December'
) do set MonthName=%%A

If /i "%~1" Equ "/FullScan" Goto :Skipover
If /i "%~1" Equ "/Year"  Set Base=%Base%\%Year%
If /i "%~1" Equ "/Month" Set Base=%Base%\%Year%\%MonthName%
If /i "%~1" Equ "" Set Base=%Base%\%Year%\%MonthName%\%Day%

:skipover
PushD "%Base%" || (Echo couldn't pushd %Base%&Pause&Exit /B 1)
For /f  "delims=" %%A in (
  'Dir /B/S/A-D .\*.wav'
) Do Echo %Lame% %LameOpts% "%%~fA" "%%~dpnA.mp3" && Echo Del "%%~fA"
PopD

【讨论】:

  • 哇...这些信息都很棒,而且看起来很有效。我在两行之间停了下来,这样我就可以检查回声了,输出显示它运行了……但是我去了物理文件夹,即使在 .cmd 中,.wav 文件仍然在文件夹中输出显示它们已转换为 .mp3,然后被删除。然后我尝试再次运行该程序并收到此错误消息:“找不到文件”
  • 回声的呢,你把它们去掉了吗?如果是,是否创建了 mp3?
  • 好吧,我是个白痴……我没有拉回声。当我拉回回声时,这一切都适用于当天,但昨天,我的目录中仍然有 .wav 文件。所以它适用于当天,但没有倒退。我一直在向您寻求帮助,我感到很难过,我只是被困住了,您太棒了,非常感谢!
  • 我会讨厌安卓应用,因为它不允许发送输入的消息。没关系 - 为什么不尝试使用 cmdline arg /month 运行批处理。如果没有更多的 wav 文件,它只会花费 dir 更多时间。 HTH
  • 所以我删除了这一行: If /i "%~1" Equ "" Set Base=%Base%\%Year%\%MonthName%\%Day% 并且它在前一天工作.现在,如果我是正确的(很抱歉问什么看起来像一个真正的基本问题)如果我消除 If /i "%~1" Equ "/Year" Set Base=%Base%\%Year% If / i "%~1" Equ "/Month" Set Base=%Base%\%Year%\%MonthName% 那应该扫描整个父目录,对吗?我的意思是,我希望它即使在我离开时也能正常工作,我是否需要消除所有这些线路,以便它能够永久继续工作?
【解决方案2】:
@echo off
PushD
for %%i in (*.wav) do someexecutablenameherwouldbehelpfulIthink "\\wideorbit.byui.edu\d\Radio Productions\Air Check\2016\November\22" -V 6 --vbr-old --resample 22.05 "%%i" "%%~ni.mp3"
PopD
pause

【讨论】:

  • 所以这有帮助,(顺便说一下,我的可执行文件是 lame.exe,我应该说清楚,我的错),我不再收到错误消息,只是没有发生任何事情。
  • 如果你 echo someexecut... 那么你应该得到正在生成的任务列表。这些是正确的吗?如果您从提示符执行完全相同的任务,是否“发生了什么事”?如果没有,您需要对任务参数进行哪些更改才能使某些事情发生?
  • 当我回显该行时,没有生成任何任务。这是一个很好的问题,当我继续尝试让它发挥作用时,我会考虑这个问题。
  • 这意味着pushd之后的当前目录没有.wav文件。也许pushd "your directory with .wav files" 可能会有所帮助。
【解决方案3】:

要将目录树中的所有.wav 文件转换为.mp3 文件,您可以使用以下代码:

pushd "\\wideorbit.byui.edu\d\Radio Productions\Air Check" || exit /B 1
for /R %%F in ("*.wav") do (
    pushd "%%~dpF" && (
        lame -V 6 --vbr-old --resample 22.05 "%%~nxF" "%%~nF.mp3" && (
            del "%%~nxF"
        )
        popd
    )
)
popd

要转换今天的.wav 文件(或者更准确地说是今天修改日期的文件,不检查父目录名称),您可以使用以下代码:

pushd "\\wideorbit.byui.edu\d\Radio Productions\Air Check" || exit /B 1
for /F "delims=" %%F in ('
    forfiles /S /M "*.wav" /D +0 /C "cmd /C echo @path"
') do (
    pushd "%%~dpF" && (
        lame -V 6 --vbr-old --resample 22.05 "%%~nxF" "%%~nF.mp3" && (
            del "%%~nxF"
        )
        popd
    )
)
popd

请注意,对于这两种方法,成功转换的 .wav 文件随后会被删除。

【讨论】:

    【解决方案4】:

    只能推荐“EZ CD Audio Converter”,使用多年,非常兴奋,用于转换(也可以一次性删除)。不贵,一分钱一分货。提供 30 天免费试用。

    对于组织、移动、标记,我推荐“mp3tag”。可以批量工作并标记和移动文件。很棒的免费软件,但要发挥全部潜力,您必须学习语法。

    【讨论】:

    • 这根本不是问题的答案。他们在批处理文件脚本方面遇到问题 - 不是在寻找软件推荐。
    • 但在我看来,我仍然会陷入同样的​​境地:必须手动完成所有操作。我工作的地方有很多人员流动(因为它是一个大学校园),所以当我离开时,我只想让它在后台工作。另外,如果我不得不买东西,我可能没有预算。
    猜你喜欢
    • 2011-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多