Неполадки в скрипте пакетной программы с именами файлов с пробелами - PullRequest
1 голос
/ 08 октября 2009

Ниже приведен пакетный скрипт, который вызывает mp3splt (программа, которая разбивает mp3s http://mp3splt.sourceforge.net/mp3splt_page/home.php) на разделы длиной 5 минут.

for /f %%a IN ('dir /b *.mp3') do call c:\PROGRA~1\mp3splt\mp3splt -t 5.0 -o output\@f+-+@n+-+@t  %%a

Это прерывается, когда mp3-файлы содержат пробел. Кто-нибудь может предложить обходной путь?

Ответы [ 2 ]

2 голосов
/ 18 ноября 2009
for %%a IN (*.mp3) do (
    call c:\PROGRA~1\mp3splt\mp3splt -t 5.0 -o output\@f+-+@n+-+@t "%%a"
)

То, что другие говорят здесь, чтобы процитировать переменную, несомненно, правильно. Это необходимо для правильной работы. Но это также только половина решения.

Ваша проблема здесь в том, что dir /b выплевывает строки текста, каждая из которых содержит одно имя файла, например:

foo bar.mp3
baz gak.mp3
track01.mp3
...

for /f, с другой стороны, предназначен для чтения файлов или чего-то еще (вывод dir в данном случае) построчно ... , но также выполняет токенизацию. Это означает, что он разбивает строки в настраиваемых местах на отдельные токены.

По умолчанию / F пропускает первый пробел отдельный токен от каждой строки каждого файл. Пустые строки пропускаются. Вы может переопределить разбор по умолчанию поведение, указав необязательный параметр "параметры". Это цитата строка, которая содержит один или несколько ключевые слова, чтобы указать другой разбор опции. - справка для

Таким образом, вы получите только часть перед первым пробелом имени файла. Вы можете обойти это, используя

for /f "delims=" in ...

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

Я регулярно удивляюсь, почему люди склонны выбирать замысловатое и неправильное решение вместо простого, ясного и правильного.

1 голос
/ 08 октября 2009

Вы можете заключить в кавычки переменную, содержащую имя файла:

"%%a"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...