2013-06-03 9 views
4

Я создаю этот командный файл, который работает с handbrakecli, для пакетного преобразования avi в mp4.Batch File Loop Пропустить файл, если имя содержит

Однако я застрял в том, как продолжить цикл и пропустить текущий файл внутри цикла.

FOR /R "%somepath%" %%G in (*.avi) DO (

rem skip if filename contains word trailer 

rem skip if file name contains word sample 

rem do conversion 
) 

Это в настоящее время не работает в пропуская файлы, которые содержат прицеп или образец

Я попытался с помощью находку или Findstr и оба не могут пропустить.

echo "%%G" | c:\windows\system32\findstr /i "trailer" > NUL 
    If %ERRORLEVEL% EQU 1 set skip Yes 

Здесь для образца.

echo "%%G" | c:\windows\system32\findstr /i "sample" > NUL 
    If %ERRORLEVEL% EQU 1 set skip Yes 

Если файл содержит либо прицеп или образец, я не хочу делать какие-либо handbrakecli преобразования, но и просто пропустить его.

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

Я попытался с помощью находку или Findstr и оба не в состоянии установить пропустить да

если пропустить ==: Нет (бэр не делать преобразование)

Я только хочу, чтобы преобразовать без трейлера/AVI файлы примеров ,

Спасибо за ваше время.

+0

http://pastebin.com/qY2u4HX2 В этом обновленном обновленном коде с предложениями ниже. – crosenblum

+0

Также очень глупый вопрос, не знаю, почему, но я должен всегда указывать путь для find или findstr, и это ошибка пути, или что? Просто любопытно. – crosenblum

ответ

6

попробовать это, поместите ваши команды преобразования в цикле и удалить слово echo перед тем handbrakecli если выход OK:

@echo off &setlocal 
FOR /R "%somepath%" %%G in (*.avi) DO (
    set "fpath=%%G" 
    set "fname=%%~nG" 
    setlocal enabledelayedexpansion 
    if "!fname!"=="!fname:trailer=!" if "!fname!"=="!fname:sample=!" (
     echo handbrakecli.exe "!fpath!" &rem put your conversion command here 
     >>"logfile.log" echo !fname! 
    ) 
    endlocal 
) 

Имя файла + путь к файлу в переменной "!fpath!".

Добавлен некоторый код относительно потребности ОП:

@echo off &setlocal 
rem replace avi with mp4 files in my movie folder 
rem grab 4 random folders with avi in them and no mp4 

rem Settings for this Batch File 
set "moviepath=H:\Movies" 
set "logfile=C:\Documents and Settings\%USERNAME%\LogFiles\avi_converter.log" 

rem check if log file exists 
if not exist "%logfile%" echo(>"%logfile%" 

rem create empty convert file 
copy nul "convert_movies.bat" >nul 2>&1 

rem add echo off 
echo @echo off >>"convert_movies.bat" 

rem set counter 
SET /A COUNT=1 

FOR /R "%moviepath%" %%G in (*.avi) DO (
    set "fpath=%%~fG" 
    set "fname=%%~nG" 
    setlocal enabledelayedexpansion 

    rem check if count greater than 4 
    if !COUNT! gtr 4 goto:eof 

    if "!fname!"=="!fname:trailer=!" if "!fname!"=="!fname:sample=!" (
     rem echo handbrakecli.exe "!fpath!" &rem put your conversion command here 

      rem Send File To HandBrakeCLI 
      CALL :DOHandBrakeCLI "!fpath!" 

      rem Delete File 
      CALL :DeleteOldFile "!fpath!" 

      rem Add Log Entry 
      CALL :LogEntry "!fpath!" 

      rem add line break space 
      echo(>>"convert_movies.bat" 

      endlocal 
      rem increment counter 
      SET /A COUNT+=1 

    ) else endlocal 
) 
rem end main program, to close cmd window replace it with EXIT 
goto:eof 

:DOHandBrakeCLI 
rem skip if the parameter is empty 
IF "%~1"=="" goto:eof 
For %%A in ("%~1") do (
    Set "Folder=%%~dpA" 
    Set "Name=%%~nxA" 
) 
rem echo %Folder%%Name% 
echo start /b "" "c:\handbrakecli\HandBrakeCLI.exe" -i "%~1" -o "%Folder%%~n1.mp4" --preset="High Profile">>"convert_movies.bat" 
exit /b 

:DeleteOldFile 
rem skip if the parameter is empty 
IF "%~1"=="" goto:eof 
For %%A in ("%~1") do (
    Set "Folder=%%~dpA" 
    Set "Name=%%~nxA" 
) 
rem sends parameters to deletefile which will make sure new file exists before deleting old one 
echo c:\projects\deletefile.bat "%~1" "%Folder%%~n1.mp4">>"convert_movies.bat" 
exit /b 

:LogEntry 
rem skip if the parameter is empty 
IF "%~1"=="" goto:eof 
echo "%~1">>"%logfile%" 
exit /b 
+0

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

+0

@crosenblum - я сделал редактирование: 1) поместил команду журнала в 2) исправлена ​​ошибка (поместите endlocal после первых закрывающих круглых скобок) – Endoro

+0

Проверьте мой pastebin, чтобы увидеть код, который я использую, в сочетании с кодом, который вы предложили. У меня уже были команды файла журнала, чтобы помочь в регистрации, удалении файлов. Это похоже на 90%, и большое спасибо. Теперь осталось две вещи: ограничьте цикл только числом х раз, чтобы я не перегружал мой компьютер, слишком много конвертировал и обрабатывал имена файлов с необычными символами, такими как азиатские языки. Есть предположения? – crosenblum

2

Это трудно понять, где ваш пост псевдокод и где фактический код.

Первый образец содержит только REM заявления, так что это не удивительно, что он, по-видимому, ничего не делает.

Ваш второй и третий образцы фактически идентичны - единственная разница - это целевая строка. Это не удивительно, что переменная skip не установлен в Yes, так как правильный синтаксис

if %errorlevel% equ 0 set skip=Yes 

Синтаксис Вы разместили будет REPORT, что skip не определен - он игнорирует Yes

HOWEVER этот синтаксис может использоваться только OUTSIDE"block statement" - то есть инструкция с несколькими инструкциями (заключенная в круглые скобки) или каскадированная & по & амперсандам. Пакет сначала PARSES полный оператор - от FOR или if до соответствующей закрывающей скобки и THEN выполняет его.В рамках фазы PARSING любое значение %var%, включая %errorlevel%, заменяется на его значение в момент, когда весь оператор равен parsed - не изменяется в связи с работой for.

Для того, чтобы использовать значение, как он меняется, вам нужно использовать

if errorlevel 1 (do_something) else (do_something_else) 

где do_something и do_something_else) сами могут быть сложные высказывания.

ИЛИ

if defined variable (do_something) else (do_something_else) 

где переменная либо определяется или не

ИЛИ

setlocal enabledelayedexpansion 
.... 
if !errorlevel! equ x (do_something) else (do_something_else) 

ИЛИ

if !var! neq something (do_something) else (do_something_else) 

Но это вполне возможно, что

FOR /R "%somepath%" %%G in (*.avi) DO (
echo(%%G|findstr /i "sample trailer" >nul 
if errorlevel 1 echo %%G 
) 

предоставит вам соответствующий скелет.

Эхо имя файла через FINDSTR и ищите «образец» или «трейлер» /i без учета регистра. Findstr устанавливает errorlevel 0, если найдена одна целевая строка, в противном случае - и синтаксис if errorlevel x работает с динамическим значением errorlevel в цикле.

3

Это должно работать:

@echo off 
FOR /R "%somepath%" %%G in (*.avi) DO (
echo "%%~nG" |findstr /i "trailer sample">nul || (
    rem do conversion 
) 
) 
+0

+1, хорошая идея, но 'findstr' может быть медленнее, чем' if ... if ... '. И '%% G' содержит полный путь. – Endoro

+1

Спасибо за ваши комментарии - я заменил его на '%% ~ nG'. Findstr, безусловно, будет медленнее, но я подозреваю, что каждый кодировщик AVI займет больше часа, поэтому время не является фактором. :) – foxidrive

0

Файл Batch ниже решить оригинальный вопрос и ограничить количество преобразованных файлов в заданное число (что не появляется в исходном вопросе):

@echo off 
setlocal EnableDelayedExpansion 
rem Insert in the next line the list of files to skip 
set skip=/trailer/sample/ 
set count=0 
FOR /R "%somepath%" %%G in (*.avi) DO (
    if /I "!skip:/%%~nG/=!" equ "%skip%" (
     echo Current file name is not in skip variable 
     echo Do conversion on: %%G 
     set /A count+=1 
     if !count! equ 20 goto :endLoop 
    ) 
) 
:endLoop 
echo Converted files: %count% 

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

  • Нет связанных вопросов^_^