Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  

Показать сообщение отдельно

Пользователь


Сообщения: 122
Благодарности: 6

Профиль | Отправить PM | Цитировать


после твоей помощи написал вот такой вот скрипт, но запутался 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

Отправлено: 14:26, 05-11-2015 | #9