2015-02-04 4 views
0

У меня есть следующий код пакетного файла, чтобы преобразовать некоторые видео файлы с HandBrakeCLI:пакетного файла для пути перетаскивания и падение сопоставляя HandBraking видео

for /R .\test %%F in (*.mp4,*.avi,*.flv,*.mov,*.3gp,*.wmv,*.mkv,*.ts) do (
HandBrakeCLI -e x264 --x264-preset medium -q 35 --crop 0:0:0:0 --aencoder copy -i "%%~fF" -o "%%~dpF%%~nF_conv.mp4" 
if exist "%%~dpF%%~nF_conv.mp4" (
    del "%%~fF" 
    ren "%%~dpF%%~nF_conv.mp4" "%%~nxF" 
    ) 
) 

Чтобы применить этот код на видео, я должен копировать пакетный файл и Handbrake.exe (а также его относительные папки) и вставьте их рядом с папкой с именем test (в приведенном выше коде), затем измените имя «test» в пакетном файле на имя этой папки, затем запустите пакетный файл.

Не могли бы вы написать пакетный файл таким образом, чтобы мы запускали его в произвольной папке, поэтому он запрашивает папку, содержащую видео, и мы пишем путь (или просто перетаскиваем папку в командную строку и нажимаем введите), не перемещая файлы и переименовывая «тест»?

ответ

1

Используйте "%~1" читать drag- и-drop.

for /R "%~1" %%F in (etc...) 

Если партия скрипт запускается без перетаскивания (if "%~1"==""), вы можете использовать folder chooser, чтобы позволить пользователю просматривать для папки.

@if (@CodeSection == @Batch) @then 

:: based on fchooser2.bat 
:: https://stackoverflow.com/a/15906994/1683264 

@echo off 
setlocal 

if "%~1"=="" (
    call :chooser dir || goto usage 
) else if exist "%~1" (
    set "dir=%~1" 
) else goto usage 

for /R "%dir%" %%F in (*.mp4,*.avi,*.flv,*.mov,*.3gp,*.wmv,*.mkv,*.ts) do (
    HandBrakeCLI -e x264 --x264-preset medium -q 35 --crop 0:0:0:0 --aencoder copy -i "%%~fF" -o "%%~dpF%%~nF_conv.mp4" 
    if exist "%%~dpF%%~nF_conv.mp4" (
     del "%%~fF" 
     ren "%%~dpF%%~nF_conv.mp4" "%%~nxF" 
    ) 
) 

:: end main runtime. Pause if dragged-and-dropped or double-clicked. 
if /i "%cmdcmdline:~0,6%"=="cmd /c" pause 
goto :EOF 

:chooser <var_to_set> 
setlocal 
for /f "delims=" %%I in ('cscript /nologo /e:jscript "%~f0"') do (
    if not "%%~I"=="" if exist "%%~I" (
     endlocal & set "%~1=%%~I" 
     exit /b 0 
    ) 
) 
exit /b 1 

:usage 
echo Usage: %~nx0 [directory] 
goto :EOF 

@end 
// JScript portion 

var shl = new ActiveXObject("Shell.Application"); 
var folder = shl.BrowseForFolder(0, "Please choose a folder.", 0, 0x00); 
WSH.Echo(folder ? folder.self.path : ''); 
+0

Также стоит отметить, если перетащить более одной папки, остальные будут переданы в виде% ~ 2,% ~ 3 и т.д. Если вы выбрали несколько элементов, они будут обработаны для один из них вы перетащили, а затем снова вернитесь вверх - если вы выделите файлы file1, file2, file3 и file4, а затем перетащите файл3 в скрипт, они будут обработаны в файле заказа3, file4, file1, file2. – SomethingDark

1

Вы должны создать переменную для чтения из пользовательского ввода

set /p path=Videos path : 

for /R %path% %%F in (*.mp4,*.avi,*.flv,*.mov,*.3gp,*.wmv,*.mkv,*.ts) do (
HandBrakeCLI -e x264 --x264-preset medium -q 35 --crop 0:0:0:0 --aencoder copy -i "%%~fF" -o "%%~dpF%%~nF_conv.mp4" 
if exist "%%~dpF%%~nF_conv.mp4" (
    del "%%~fF" 
    ren "%%~dpF%%~nF_conv.mp4" "%%~nxF" 
    ) 
) 

set /p будет работать нормально либо записывая путь или с папки перетащить и падение