对目录中的多个OGG文件运行操作

时间:2015-11-20 00:08:48

标签: windows batch-file for-loop sox

我试图在Windows批处理中创建一个例程来运行" sox.exe"在指定目录中的每个OGG文件上。我目前的问题是它没有正确处理路径,更不用说正确执行操作了。如果我在终端窗口中手动运行命令,单独为每个文件运行,它可以正常工作。

我还想让输出文件成为一个不同的名称(否则生成的文件会大量使用。

" sox.exe失败格式:无法打开输出文件`\ temp \ OGG \ Rain.ogg':没有这样的文件或目录"

@echo off

setlocal enabledelayedexpansion
cd Data
mkdir temp

for %%A in ("OGG\*.ogg") do (
sox.exe %%A -C 0 \temp\%%A
)

文件的一般布局如下:

OptOGG
  |--OptOGG.bat
  |
  |--Data
     |--OGG
     |  |--AudioFile.ogg
     |
     |--sox.exe

我也有所有sox.exe依赖项,并且已经过手工测试,我只是没有将它们包含在上面的布局中。

基本上,我想对目录中的所有ogg文件执行sox操作(稍后将更改为远程设备目录),让它们最终进入临时目录,然后将它们移回原始目录,覆盖原始文件,保留与原始文件相同的名称。

2 个答案:

答案 0 :(得分:0)

.\开头的相对路径引用当前目录。

..\开头的相对路径引用当前目录的父目录。

\开头的相对路径引用当前驱动器的根目录。

因此,您在数据文件夹中创建了临时文件夹,但在 FOR 中指定了当前驱动器根目录中没有Temp文件夹的临时文件夹。

这个带有额外检查的批次代码应该可以满足您的需要。

@echo off
setlocal

rem Get drive and path of batch file ending with a backslash and append
rem Data which is the name of the data folder containing in subfolder
rem OGG the audio files to optimize.
set "DataFolder=%~dp0Data"

rem Does this folder exist?
if not exist "%DataFolder%" (
    echo Folder %DataFolder% does not exist!
    goto EndBatch
)

if not exist "%DataFolder%\OGG" (
    echo Folder %DataFolder%\OGG does not exist!
    goto EndBatch
)

if not exist "%DataFolder%\OGG\*.ogg" (
    echo Folder %DataFolder%\OGG does not contain any OGG file.
    goto EndBatch
)

set "TempFolder=%DataFolder%\Temp"
if not exist "%TempFolder%" (
    mkdir "%TempFolder%"
    if errorlevel 1 (
        echo Failed to create %TempFolder%
        goto EndBatch
    )
)

rem Run SOX on every OGG file in subfolder OGG of data
rem folder with output file written to temp folder.
for %%A in ("%DataFolder%\OGG\*.ogg") do (
    echo "%DataFolder%\sox.exe" "%%~fA" -C 0 "%TempFolder%\%%~nxA"
)
endlocal
goto :EOF

:EndBatch
endlocal
echo.
echo Press any key to exit batch job %~n0.
pause >nul

要了解使用的命令及其工作原理,请打开命令提示符窗口,执行以下命令,并完全阅读为每个命令显示的所有帮助页面。

  • echo /?
  • endlocal /?
  • for /?
  • goto /?
  • if /?
  • mkdir /?
  • pause /?
  • rem /?
  • set /?
  • setlocal /?

答案 1 :(得分:0)

感谢。很有帮助。我终于想出了一个像我想要的那样工作的脚本(关闭)。它并不完美,因为它不会在文件名中拉出带空格的文件。这是一个更大的脚本的一部分,因此优化标签在其他地方。

if %choice% == a (
  if exist OGG del /Q OGG
  @md OGG
  cls
  Echo.
  Echo  Mounting system R/W...
  adb remount
  Echo.
  Echo  Pulling audio files...
  adb pull /system/media/audio/alarms/ .
  for %%a in ("*.ogg") do (
    Echo %%a
    sox.exe %%a -C 0 "%current%\Data\OGG\%%a"
  )
  Echo.
  Echo  Pushing optimized audio back to device...
  adb push OGG /system/media/audio/alarms
  @rmdir /S /Q OGG
  @del *.ogg
  Echo.
  Echo  Optimizations complete!
  Pause
  goto optimizations
)