после твоей помощи написал вот такой вот скрипт, но запутался c ! и % переодически если смотреть дебаг (@echo off) он не распознает переменные, посмотри пожалуйста я не могу понять куда endlocal нужно вставлять или как правильно пользоваться !var! а где %var%
Скрипт работает в двух режимах
1. натравливается на директорию и переименовывает все видео файлы в под папках на имя папок в которых в это время находятся, далее отчищает от мусора, после этого перемещает эти видео файлы в корень и удаляет пустые под папки
a. если в под папке несколько видео файлов то присваивает им названия partYНомер и имя папки в которой лежит
b. если в под папке только 1 файл то называет его по имени папки в которой лежит
2. также натравливается на директорию но только чистит все имена от мусора
логирование помечено REM (если разРЕМить то будет все писаться в лог)
Код:
@echo off
setlocal enableextensions enabledelayedexpansion
REM chcp 1251
set "sDestFolder=D:\video\test"
set "sLog=%sDestFolder%\renamer.log"
del /f /q %slog%
echo ##^> %date% %time% >> %sLog%
set "ext=*.mp4 *.mkv *.flv *.wmv *.avi *.m4v"
set "exceptions=480p 540p 720p 1080p"
:: Различие методов в том что по умолчанию работает с папками и их именами
:: а метод только очистки работает с файлами и не привязан к папкам
echo %* | find /i "/clean">nul&&set clean=1&&echo clean-mode >>%sLog%||echo rename-mode >>%sLog%
for /r "%sDestFolder%" %%a in (%ext%) do call :action "%%a"
:: Очищать папки нужно только при работе с подпапками
if not defined clean for /r "%sDestFolder%" %%a in (%ext%) do call :moving "%%a"
call :erase
echo ##^< %date% %time% >> %sLog%
REM chcp 866
type "%slog%"
pause
endlocal
exit /b
:action
setlocal enableextensions enabledelayedexpansion
:: Переподсчет происходит только при смене папки
if not "!sSourcePath!" == "%~dp1" set "sMultyFile="
set "sSourcePath=%~dp1"
set "sCountFile="
set "sFile=!sSourcePath:%sDestFolder%=!..\%~nx1"
if defined clean call :ActionCleanOnly "%~1"&exit /b
:: Если файл в НЕ под папке то пропускаем его
if "%sDestFolder%\%~nx1" == "%~1" echo skip !sFile! >>%sLog%&exit /b
for /r "%sSourcePath%" %%k in (*.%ext%) do set /a sCountFile+=1
call :getinfo "%~1"
if "%sCountFile%" == "1" (
set "thread=1"
echo SingleFile: !sFile! >>%sLog%
call :renaming "%~1"
) ELSE (
set "thread="
:: Для красивого лога, чтобы сообщение о папке выводилось только 1 раз
if not "!MultiFiles!" == "%~dp1" echo MultiFiles: "%~dp1" >>%sLog%
set "MultiFiles=%~dp1"
call :renaming "%~1"
)
exit /b
:getinfo
exit /b
:erase
:: Удаляем мусор из директории
for /r "%sDestFolder%" %%a in (*.nfo) do call del /f /q "%%a"
for /r "%sDestFolder%" %%a in (*.txt) do call del /f /q "%%a"
for /f "delims=" %%d in ('dir "%sDestFolder%" /s /b /ad ^| sort /r') do rd "%%d"
exit /b
:ActionCleanOnly
:: Добавляем part убираем слеши \
set "sNewName=%~nx1"
call :cleaningname "%sNewName%"
:: Проверка на существование файла
if exist "%~dp1\%sNewName%" (
REM echo "%~nx1" ^> !sNewName! error! >>%sLog%
) else (
ren "%~1" "%sNewName%" && echo "%~nx1" ^> %sNewName% succes! >>%sLog%
)
exit /b
:renaming
set "sNewNamePart1=!sSourcePath:%sDestFolder%=!"
:: Добавляем part убираем слеши \
if "%thread%" == "1" (
set "sNewName=!sNewNamePart1:~1,-1!%~x1"
) else (
REM set "sNewName=!sNewNamePart1:~1,-1!.part!sMultyFile!%~x1"
set "sNewName=!sNewNamePart1:~1,-1!.%~nx1"
)
echo %sNewName% | find /i "\">nul&&exit /b
call :cleaningname "!sNewName!"
:: Проверка на существование файла
if exist "%~dp1\%sNewName%" (
echo "%~nx1" ^> %sNewName% error! >>%sLog%
) else (
ren "%~1" "!sNewName!"
if errorlevel 0 echo "%~nx1" ^> %sNewName% succes! >>%sLog%
)
exit /b
:moving
:: Перемещаем
set "sSourcePath=%~1"
REM set "sFile=!sSourcePath:%sDestFolder%\=!"
REM echo %sFile% | find /i "\">nul&&exit /b
:: Если файл НЕ в под папке то пропускаем его
if "%sDestFolder%\%~nx1" == "%~1" exit /b
if not exist "%sDestFolder%\%~nx1" (
move "!sSourcePath!" "%sDestFolder%"
if errorlevel 0 echo mv "%~nx1" ^> !sNewName! succes >>%sLog%
)
exit /b
:cleaningname
echo %~n1 | findstr /i "%exceptions%" > nul && for %%w in (%exceptions%) do set "sNewName=!sNewName:%%w=!"
set "sNewName=!sNewName:&=!"
set "sNewName=!sNewName:[=!"
set "sNewName=!sNewName:] =.!"
set "sNewName=!sNewName:]=!"
set "sNewName=!sNewName:(=- !"
set "sNewName=!sNewName:)=!"
set "sNewName=!sNewName:{=!"
set "sNewName=!sNewName:}=!"
set "sNewName=!sNewName: =.!"
set "sNewName=!sNewName:. .=.!"
:: обязательно должнот быть в конце т.к зачищает после предыдущих чисток
for %%l in (.. ... .... ..... ...... -- --- __ ___ _____) do set "sNewName=!sNewName:%%l=.!"
for %%l in (.. ... .... ..... ...... -- --- __ ___ _____) do set "sNewName=!sNewName:%%l=.!"
exit /b