|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - Сохранение пути при копировании |
|
CMD/BAT - Сохранение пути при копировании
|
Пользователь Сообщения: 122 |
Дома установлена папка которую проверяет скрипт cmd раз в n время, если он находит файл то начинает его конвертировать в папку done, после этого оригинальный файл перемещает в папку трэш визуально выглядит так:
структура c:\workfolder\ .. waiting-video \ collection1 \video1,video2,video3 \ collection2 \video1,video2,video3 done-video \ trash-video \ варианты на powershell Тоже подойдут |
|
Отправлено: 17:00, 29-10-2015 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать Цитата c4uran:
|
|
Отправлено: 17:33, 29-10-2015 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Пользователь Сообщения: 122
|
Профиль | Отправить PM | Цитировать До
D:\WorkFolder ├───done ├───trash └───waiting-to-convert ├───collection1 │ └───sub-collection1-1 ├───collection2 │ └───sub-collection2-1 └───collection3 В папку done сохраняются файлы пропущенные через ffmpeg а в trash файлы после конвертации перемещены оригиналы из waiting-to-convert |
Отправлено: 18:23, 29-10-2015 | #3 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать Ясно. Теперь надо смотреть на Ваш существующий:
Цитата c4uran:
|
|
Отправлено: 18:59, 29-10-2015 | #4 |
Пользователь Сообщения: 122
|
Профиль | Отправить PM | Цитировать воть
@echo off set folder=d:\workfolder set output_folder=%folder%\done set trash=%folder%\trash set ffmpeg=%folder%\ffmpeg\bin\ffmpeg.exe for /r %folder%\ %%a in (*.mp4) do call :action "%%a" exit /b :action set "outfile=%~n1.720p%~x1" %ffmpeg% -i "%~1" -vcodec h264 -vf "scale=trunc(oh*a/2)*2:min(720p\,ih)" -b:v 2000k -preset faster -acodec copy -y "%output_folder%\%outfile%" move /Y "%~1" "%trash%\%~nx1" exit /b |
|
Отправлено: 19:06, 29-10-2015 | #5 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать c4uran, почему обработка начинается с «d:\workfolder», а не с «d:\workfolder\waiting-to-convert»?
Вот Вам предварительный вариант, без очистки исходной папки: @echo off setlocal enableextensions enabledelayedexpansion set sWorkFolder=d:\workfolder set sSourceFolder=%sWorkFolder%\waiting-to-convert set sDestFolder=%sWorkFolder%\done set sBackupFolder=%sWorkFolder%\trash set sPath2ffmpeg=%sWorkFolder%\ffmpeg\bin\ffmpeg.exe for /r "%sSourceFolder%" %%i in (*.mp4) do call :action "%%i" endlocal exit /b :action setlocal enableextensions enabledelayedexpansion set "sSourcePath=%~dp1" set "sDestPath=%sDestFolder%!sSourcePath:%sSourceFolder%=!" if not exist "%sDestPath%." md "%sDestPath%" set "sDestFile=%sDestPath%%~n1.720p%~x1" "%sPath2ffmpeg%" -i "%~f1" -vcodec h264 -vf "scale=trunc(oh*a/2)*2:min(720p\,ih)" -b:v 2000k -preset faster -acodec copy -y "%sDestFile%" set "sBackupPath=%sBackupFolder%!sSourcePath:%sSourceFolder%=!" if not exist "%sBackupPath%." md "%sBackupPath%" move /y "%~1" "%sBackupPath%" endlocal exit /b |
Отправлено: 10:51, 30-10-2015 | #6 |
Пользователь Сообщения: 122
|
Профиль | Отправить PM | Цитировать спасибо! хороший метод правда не проверил еще но идея понятна, я ошибся при переносе скрипта на форум (там мусора много было с комментариями) видимо не заметил
|
Последний раз редактировалось c4uran, 30-10-2015 в 12:48. Отправлено: 11:20, 30-10-2015 | #7 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать Цитата c4uran:
|
|
Отправлено: 13:22, 30-10-2015 | #8 |
Пользователь Сообщения: 122
|
Профиль | Отправить 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 |
![]() |
Участник сейчас на форуме |
![]() |
Участник вне форума |
![]() |
Автор темы |
![]() |
Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
CMD/BAT - [решено] Отсечение пути.Как?Или получение относительного пути. | nfs911 | Скриптовые языки администрирования Windows | 12 | 19-05-2018 11:29 | |
VBS/WSH/JS - Срипт копирования пути к файлу\папке и вставка пути в письмо Outlook | trlhrn | Скриптовые языки администрирования Windows | 0 | 07-08-2015 16:21 | |
Ошибка при создании ftp. при копировании файла convlog.exe | ElOn | Microsoft Windows NT/2000/2003 | 0 | 12-01-2012 00:36 | |
C/C++ - Выбор изображения, отображения его в окне программы и сохранение пути к нему. | Virtyaluk | Программирование и базы данных | 11 | 27-01-2010 14:32 | |
Зависание при выборе пути | МИШАНЧИК | Непонятные проблемы с Железом | 39 | 03-01-2008 08:44 |
|