Воссоздавать подпапки во время пакетной команды FOR /R LOOP?

поэтому я пишу скрипт для сканирования файлов mkv и преобразования любых файлов 1080p в 720p. В настоящее время я просматриваю каждый файл, используя цикл for/r для включения подпапок. Есть ли способ воссоздать подпапки в месте назначения вывода?

Вот что у меня есть на данный момент (p.s. Это мой первый скрипт):

@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

Я хотел бы, чтобы исходный каталог был «ТВ-шоу», а вывод сохранял файлы в одной и той же структуре папок. Будет ли это выполнимо?

РЕДАКТИРОВАТЬ: я немного обновил код, добавил, если указано, чтобы сравнить %%~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.)
) 

person Jason    schedule 29.01.2016    source источник
comment
На какой версии Windows вы работаете? Вы рассматривали PowerShell? Это более современный язык сценариев. То, что вы просите, выполнимо, вам нужна пара строк, прежде чем вы вызовете handbreak, чтобы проанализировать относительный путь из %j, а затем параметр -o изменится на %output%\%relpath%\%%~xnj. Анализ относительного пути будет затруднен, возможно, используйте SUBST для назначения букв диска исходному и выходному путям, тогда %%~pj дает относительный путь без буквы диска. Удачи.   -  person jimhark    schedule 30.01.2016
comment
Скрипт будет работать на компьютере с Windows 7. Сначала я думал о powershell, не помню, почему я не пошел с ним. Я не в восторге от переписывания сценария, над которым я только что работал, но если ничего не поможет, я подумаю над этим. Спасибо.   -  person Jason    schedule 30.01.2016
comment
Невозможно использовать подстановочные знаки в if (и вы не можете использовать подстроку в метапеременной, такой как %%q). Почему бы не использовать if "!sea:~0,7!"=="Season " (...? У вас все еще есть проблема с этим? Если да - в чем проблема с обновленным кодом??   -  person Magoo    schedule 31.01.2016
comment
Я не был полностью уверен в синтаксисе, но используя !sea:~0,6! и сезон, кажется, работает сейчас. Спасибо за вашу помощь.   -  person Jason    schedule 31.01.2016


Ответы (1)


Безусловно.

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

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

(~dpj дает вам диск/путь %%j; затем используйте причуду, чтобы извлечь имя и расширение последнего элемента имени каталога)

person Magoo    schedule 29.01.2016
comment
Я попробую. Я думал попробовать что-то вроде сравнения %%~pj с %source% и попытаться удалить общие пути. Или что-то вроде set Season=%%~pj:!source!=%%, но я не могу заставить это работать… - person Jason; 30.01.2016