Пакетный синтаксис для цикла, если существует - PullRequest
2 голосов
/ 22 января 2012

Попытка создать пакет для преобразования файлов .WTV в файлы mpg. Код ниже, который я хочу запускать раз в ночь, чтобы преобразовать ежедневные записи для использования на моем медиа-сервере. Синтаксис, который меня интересует, это строка цикла for. Я хочу запускать сценарий только для файлов, которые не были преобразованы и перемещены. Я не могу удалить оригинал в случае возникновения ошибки. Последним циклом перемещения является получение всех файлов, которые он не мог переместить с первой попытки.

входные файлы выглядят так: show.wtv

вывод в файле - show.wtv.mpg (с которым я в порядке)

Я не уверен, как написать это для цикла, чтобы получить желаемую функциональность. Любая помощь приветствуется.

Оригинальная идея пришла от http://ireckon.net/2009/10/converting-wtv-to-mpg-in-windows-7/

@echo off

set recordedtv="D:\Recorded TV\"
set destfolder="D:\Videos\Recorded TV\"
set ffmpeg="D:\TV Converter\FFMPEG\ffmpeg.exe"
set wtvconv="C:\Windows\ehome\WTVConverter.exe"

for %%f in (%recordedtv%*.wtv) Do If Not Exist "%destfolder%%%f.mpg" (
%wtvconv% "%%f" "%%f.dvr-ms"
%ffmpeg% -y -i "%%f.dvr-ms" -vcodec copy -acodec copy -f dvd "%%f.mpg"
del "%%f.dvr-ms"
move "%%f.mpg" %destfolder%
)

for %%f in (%recordedtv%*.mpg) Do move "%%f" %destfolder%

ОБНОВЛЕНИЕ: Закончено с помощью этого

@echo off

set "recordedtv=D:\Recorded TV\"
set "destfolder=D:\Videos\Recorded TV\"
set ffmpeg="D:\TV Converter\FFMPEG\ffmpeg.exe"
set wtvconv="C:\Windows\ehome\WTVConverter.exe"

for %%f in ("%recordedtv%*.wtv") do If Not Exist "%destfolder%%%~nxf.mpg" (
%wtvconv% "%%f" "%%f.dvr-ms"
%ffmpeg% -y -i "%%f.dvr-ms" -vcodec copy -acodec copy -f dvd "%%f.mpg"
del "%%f.dvr-ms"
move "%%f.mpg" "%destfolder%"
)

for %%f in ("%recordedtv%*.mpg") Do move "%%f" "%destfolder%"

1 Ответ

1 голос
/ 22 января 2012

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

...
set "recordedtv=D:\Recorded TV\"
set "destfolder=D:\Videos\Recorded TV\"
...

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

for %%f in ("%recordedtv%*.wtv") do ...
...
for %%f in ("%recordedtv%*.mpg") do ...

Обратите внимание и на другие места. Например, в команде move в вашем скрипте целевой путь также должен быть разделен:

move "%%f.mpg" "%destfolder%"

Что касается проверки существования файла, то это делается с помощью команды if exist:

if exist <i>target_file</i> (
...    // do whatever you need to do in case the file exists
)

Бит target_file может быть файлом, маской или каталогом (в последнем случае он должен заканчиваться \).

UPDATE

Я думаю, что теперь вижу конкретную проблему с вашим скриптом. Эта часть

for %%f in (%recordedtv%*.wtv) Do If Not Exist "%destfolder%%%f.mpg"

неверно в том смысле, что он объединяет папку назначения и полный путь к файлу .wtv и использует полученную строку в качестве единого пути. Так что "%destfolder%%%f" оценивается примерно так:

"D:\Videos\Recorded TV\D:\Recorded TV\somename.wtv.mpg"

Я не уверен только в дополнительных кавычках, но здесь дело не в этом. Я думаю, вы можете увидеть главную проблему. Чтобы решить эту проблему, вам нужно извлечь только имя и расширение файла из D:\Recorded TV\somename.wtv.mpg, что делается с помощью объединенного спецификатора ~nx (n означает «имя» и x для «расширение»):

for %%f in ("%recordedtv%*.wtv") Do If Not Exist "%destfolder%%%~nxf.mpg"

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

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