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

Windows 对目录中的多个OGG文件运行操作,windows,batch-file,for-loop,sox,Windows,Batch File,For Loop,Sox,我正在尝试在Windows批处理中创建一个例程,该例程将在指定目录中的每个OGG文件上运行“sox.exe”。我目前的问题是它不能正确地处理路径,更不用说正确地执行操作了。如果我在终端窗口中分别为每个文件手动运行该命令,它就可以正常工作 我还想让输出文件有一个不同的名称(否则,结果文件会被大范围地篡改) sox.exe失败格式:无法打开输出文件“\temp\OGG\Rain.OGG”:没有这样的文件或目录 文件的总体布局如下所示: OptOGG |--OptOGG.bat | |--

我正在尝试在Windows批处理中创建一个例程,该例程将在指定目录中的每个OGG文件上运行“sox.exe”。我目前的问题是它不能正确地处理路径,更不用说正确地执行操作了。如果我在终端窗口中分别为每个文件手动运行该命令,它就可以正常工作

我还想让输出文件有一个不同的名称(否则,结果文件会被大范围地篡改)

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

文件的总体布局如下所示:

OptOGG
  |--OptOGG.bat
  |
  |--Data
     |--OGG
     |  |--AudioFile.ogg
     |
     |--sox.exe
我也有所有的sox.exe依赖项,它已经过手工测试,我只是没有将它们包含在上面的布局中


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

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


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


仅以
\
开头的相对路径引用当前驱动器的根

因此,您在data folder中创建了临时文件夹,但在中为循环指定了当前驱动器根目录中不存在
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/?
  • 获取/?
  • goto/?
  • 如果/?
  • mkdir/?
  • 暂停/?
  • rem/?
  • 设置/?
  • setlocal/?

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


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


仅以
\
开头的相对路径引用当前驱动器的根

因此,您在data folder中创建了临时文件夹,但在中为循环指定了当前驱动器根目录中不存在
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/?
  • 获取/?
  • goto/?
  • 如果/?
  • mkdir/?
  • 暂停/?
  • rem/?
  • 设置/?
  • setlocal/?

谢谢。非常有帮助。我终于想出了一个脚本,它可以像我想要的那样工作(关闭)。它并不完美,因为它不会提取文件名中带有空格的文件。这是一个更大脚本的一部分,所以优化标签在别处

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
)

谢谢。非常有用。我终于想出了一个我想要的脚本(close)。它并不完美,因为它不会提取文件名中带有空格的文件。这是一个更大的脚本的一部分,所以优化标签在别处

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
)

谢谢。非常有用。我终于想出了一个像我想要的那样工作的脚本(关闭)。这并不完美,因为它不会拉文件名中有空格的文件。谢谢。非常有用。我终于想出了一个像我想要的那样工作的脚本(关闭)。这并不完美,因为它不会拉文件名中有空格的文件。使用
sox.exe“%%a”-C 0%current%\Data\OGG\%%a“
在第一个
%%a
周围加引号,批处理文件也适用于文件名中包含1个或多个空格的OGG文件。还应使用引号进行字符串比较,即,如果代码中的“%choice%”==“a”(),则第一行应为
。请使用
sox.exe“%%a”-0%当前%\Data\OGG\%%a“
在第一个
%%a
周围加引号,批处理文件也适用于文件名中包含1个或多个空格的OGG文件。还应使用引号进行字符串比较,即,如果代码中的“%choice%”==“a”(
),则第一行应为