2

所以我正在编写一个脚本来扫描 mkv 文件并将任何 1080p 文件下转换为 720p。我目前正在使用“for /r”循环遍历每个文件以包含子文件夹。有没有办法可以将子文件夹重新创建到输出目的地?

这是我到目前为止所拥有的(ps 这是我的第一个脚本):

@echo off
set mediainfo="%~dp0MediaInfo.exe"
set result="%~dp0width.txt"
set handbrake="%~dp0HandBrakeCLI.exe"

SETLOCAL ENABLEDELAYEDEXPANSION
Set /P source=Enter source path:
Set /P output=Enter destination for converted files:
if %output:~-1%==\ set output=%output:~0,-1%
if not exist %output% mkdir %output% 
for /R %source% %%j in (*.mkv) do (
    Echo Filepath is: %%j
    %mediainfo% --Inform=Video;%%Width%% "%%j" > %result%
    set /P width=<%result%
    del %result%
    echo Width is: !width!
    if !width! == 1920 (%handbrake% -i "%%j" -o "%output%\%%~xnj" -f mkv -e x264 -q 20 --vfr -a 1,1 -E av_aac,ac3 -B 192 -w 1280 --keep-display-aspect -x level=4.1:vbv-bufsize=78125:vbv-maxrate=62500) else (echo No need to transcode.)
) 

现在,如果我有这样的结构:

 TV Show\Season 1
        \Season 2
        \Season 3

我希望源目录是“电视节目”,并且输出将文件保持在相同的文件夹结构中。这可行吗?

编辑:我稍微更新了代码,添加了一个 if 语句来比较 %%~nxq (第 X 季)减去最后 2 个字符与“季节”一词,以确定工作文件夹是否在季节子文件夹中。唯一的问题是如果它是“第 10 季”,那么 if 比较将显示为“季”。尚未对其进行测试,我不确定是否有办法在 if 语句中使用通配符。这是更新的代码:

@echo off
set mediainfo="%~dp0MediaInfo.exe"
set result="%~dp0width.txt"
set handbrake="%~dp0HandBrakeCLI.exe"
SETLOCAL ENABLEDELAYEDEXPANSION
Set /P source=Enter source path:
echo Source path is: %source%
Set /P a=Enter destination for converted files:
set output=%a:"=%
if not %output:~-1%==\ (set output="%output%\") else (set output="%output%")
echo Destinition path is: %output%
if not exist %output% mkdir %output%
set dest=%output%
for /R %source% %%j in (*.mkv) do (
    Echo Filepath is: %%j
    for %%q in ("%%~dpj.") do (
        set sea=%%~nxq
        if "!sea:~0,-2!"=="Season" (
        set dest="%output:"=%%%~nxq\%%~xnj"
        set seafold="%output:"=%%%~nxq"
        if not exist !seafold! mkdir !seafold!
        ) else (
        set dest="%output:"=%%%~xnj"
        )
        echo Output Path is: !dest!
    )
    %mediainfo% --Inform=Video;%%Width%% "%%j" > %result%
    set /P width=<%result%
    del %result%
    echo Width is: !width!
    if !width! == 1920 (%handbrake% -i "%%j" -o !dest! -f mkv -e x264 -q 20 --vfr -a 1,1 -E av_aac,ac3 -B 192 -w 1280 --keep-display-aspect -x level=4.1:vbv-bufsize=78125:vbv-maxrate=62500) else (echo No need to transcode.)
) 
4

1 回答 1

1

当然。

for %%q in ("%%~dpj.") do echo %%~nxq

应该为您提供一个线索,因为到目前为止您已经完成了第一批...

~dpj给你的驱动器/路径%%j;然后使用一个怪癖来提取目录名的最后一个元素的名称和扩展名)

于 2016-01-29T22:11:46.147 回答