Выполнить операцию над несколькими файлами OGG в каталоге

Я пытаюсь сделать подпрограмму в пакете Windows, которая будет запускать «sox.exe» для каждого файла OGG в указанном каталоге. В настоящее время у меня проблема с неправильной обработкой путей, не говоря уже о правильном выполнении операции. Если я запускаю команду вручную в окне терминала для каждого файла отдельно, она работает нормально.

Я также хочу, чтобы выходной файл имел другое имя (иначе результирующий файл сильно испортится.

"sox.exe FAIL форматы: не удается открыть выходной файл `\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, и они были проверены вручную на работоспособность, я просто не включил их в макет выше.

По сути, я хочу выполнить операцию sox для всех файлов ogg в каталоге (позже он будет изменен на каталог удаленного устройства), чтобы они оказались во временном каталоге, а затем переместили их обратно в исходный каталог, перезаписав исходные файлы. , сохраняя то же имя, что и оригинал.


person Noah    schedule 20.11.2015    source источник


Ответы (2)


Относительный путь, начинающийся с .\, указывает на текущий каталог.

Относительный путь, начинающийся с ..\, указывает на родительский каталог текущего каталога.

Относительный путь, начинающийся только с \, указывает на корень текущего диска.

Таким образом, вы создали временную папку в папке данных, но указали в цикле 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 /?
person Mofi    schedule 21.11.2015
comment
Спасибо. Очень полезно. Наконец-то я придумал скрипт, который работает так, как я хочу (закрыть). Это не идеально, так как не загружает файлы с пробелами в имени файла. - person Noah; 22.11.2015

Спасибо. Очень полезно. Наконец-то я придумал скрипт, который работает так, как я хочу (закрыть). Это не идеально, так как не загружает файлы с пробелами в имени файла. Это часть гораздо более крупного скрипта, поэтому метка оптимизации находится в другом месте.

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
)
person Noah    schedule 21.11.2015
comment
Используйте sox.exe "%%a" -C 0 "%current%\Data\OGG\%%a" с кавычками вокруг первого %%a, и ваш пакетный файл будет работать также для файлов OGG, содержащих 1 или более пробелов в имени файла. И сравнения строк также должны быть сделаны с использованием кавычек, т.е. первая строка должна быть if "%choice%" == "a" ( в вашем коде. - person Mofi; 04.12.2015