2015-06-11 2 views
1

Привет, я пытаюсь создать сценарий Windows для извлечения субтитров из всех файлов .mkv в каталоге, и я запускаю к ​​проблеме.Команда Windows, работающая в cmd, но не в .bat-файле

Это мой сценарий:

dir /b | findstr .*".mkv"$ > tmpFile 
for /f "tokens=*" %f in (tmpFile) do start mkvextract.exe tracks %f 2:%~nf.ass 
del tmpFile 

Проблема заключается в том, что, когда я уверен, выполнение его в cmd.exe все работает нормально, но когда я оберните его в BAT-файл только первая и третья строка может быть выполнена.

для линии говоря эту ошибку

C:\test>dir /b | findstr .*".mkv"$ 1>tmpFile 
The following usage of the path operator in batch-parameter 
substitution is invalid: %~nf.ass 

For valid formats type CALL /? or FOR /? 
The syntax of the command is incorrect. 

C:\test>for /f "tokens=*" f 2:n (tmpFile) do start 
mkvextract.exe tracks %f 2:%~nf.ass 

Я пытался альтер сценарий, чтобы исправить ошибку, но единственное, что я достиг в том, что прекращают работу даже в командной строке. Пожалуйста помоги. :)

+0

, что это идея «findstr. *». mkv «$'? – npocmaka

+0

@npocmaka: Первый '. *' Является регулярным выражением для «любого символа нуля или более раз», '' .mkv '' является литералом «.mkv», а '' 'end - это регулярное выражение для «в конце строки»! – Aacini

ответ

1

Что должно делать dir /b | findstr .*".mkv"$ > tmpFile (похоже, javascript regex)?

в пакетном файле вы должны дважды % для FOR лексем:

dir /b | findstr /i /e ".mkv" > tmpFile 
for /f "tokens=*" %%f in (tmpFile) do start mkvextract.exe tracks %%f 2:%%~nf.ass 
del tmpFile 

, хотя это может быть сделано без временного файла:

for /f "tokens=*" %%f in ('dir /b ^| findstr /i /e ".mkv"') do start mkvextract.exe tracks %%f 2:%%~nf.ass 
+0

Спасибо, я пытался сделать только конвейер без^в скобках, но он не работал, поэтому я использовал tempfile, чтобы заставить его работать – user3788433

1

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

dir /b | findstr .*".mkv"$ > tmpFile 

Команда dir /b генерировать список имен файлов, то команда findstr получить только имена, которые начинаются с любой строки и заканчивается в «.mkv», и переназначение магазин такие имена в «tmpFile ». Чистым эффектом предыдущей строки является «сохранение имен файлов с расширением .mkv в tmpFile». (Вы можете получить тот же результат с помощью команды dir /b *.mkv > tmpFile).

Вторая строка:

for /f "tokens=*" %f in (tmpFile) do start mkvextract.exe tracks %f 2:%~nf.ass 

процесса предыдущие названия и для каждого из них выполнить команду start .... Чистым эффектом является «выполнить команду start ... для каждого файла с расширением .mkv». Последняя строка:

del tmpFile 

просто удалите вспомогательный файл.

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

for %f in (*.mkv) do start mkvextract.exe tracks %f 2:%~nf.ass 

Если вы хотите поместить предыдущую команду в пакетном файле, только в два раза знаки процента:

for %%f in (*.mkv) do start mkvextract.exe tracks %%f 2:%%~nf.ass 
+0

Спасибо, что последний ряд сделал то, что я хотел – user3788433

Смежные вопросы