用于分配给 HandBraking 视频的拖放路径的批处理文件

batch-file for drag-and-drop path assigning to HandBraking videos

我有以下批处理文件代码来使用 HandBrakeCLI 转换一些视频文件:

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" 在批处理文件中添加到该文件夹​​的名称,然后 运行 批处理文件。

您能否以我们 运行 任意文件夹中的方式编写批处理文件,这样它会提示包含视频的文件夹,然后我们写入路径(或者只是简单地将文件夹拖放到命令行并按回车键)而不移动文件并重命名 "test"?

您应该创建一个从用户输入中读取的变量

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 写下路径或文件夹拖放都可以正常工作

使用"%~1"阅读拖放参数。

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

如果批处理脚本在没有拖放的情况下启动 (if "%~1"==""),您可以使用 folder chooser 让用户浏览文件夹。

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

:: based on fchooser2.bat
:: 

@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 : '');