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

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - Сохранение пути при копировании

Ответить
Настройки темы
CMD/BAT - Сохранение пути при копировании

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


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

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


Дома установлена папка которую проверяет скрипт cmd раз в n время, если он находит файл то начинает его конвертировать в папку done, после этого оригинальный файл перемещает в папку трэш визуально выглядит так:
Код: Выделить весь код
структура c:\workfolder\ ..
    waiting-video \ collection1 \video1,video2,video3
                          \ collection2 \video1,video2,video3
    done-video \
    trash-video \
суть вопроса в том что, как бы сохранить часть пути при перемещении файлов, к концу работы скрипта выход был такой:
Код: Выделить весь код
структура c:\workfolder\ ..
    waiting-video \ ..
    done-video \ collection1 \video1.720p,video2.720p,video3.720p
                        \ collection2 \video1.720p,video2.720p,video3.720p

    trash-video \ collection1 \video1,video2,video3
                      \ collection2 \video1,video2,video3
варианты на powershell Тоже подойдут

Отправлено: 17:00, 29-10-2015

 

Ветеран


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

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


Цитата c4uran:
визуально выглядит так: »
Используйте внутреннюю команду «tree» командного процессора, дабы показать структуру папок от искомой. Потому как в описанном не очень понятно, что и как.

Отправлено: 17:33, 29-10-2015 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

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


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


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

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


До

Код: Выделить весь код
D:\WorkFolder
├───done
├───trash
└───waiting-to-convert
    ├───collection1
    │   └───sub-collection1-1
    ├───collection2
    │   └───sub-collection2-1
    └───collection3
после

Код: Выделить весь код
D:\WorkFolder
├───done
│   ├───collection1
│   │   └───sub-collection1-1
│   ├───collection2
│   │   └───sub-collection2-1
│   └───collection3
├───trash
│   ├───collection1
│   │   └───sub-collection1-1
│   ├───collection2
│   │   └───sub-collection2-1
│   └───collection3
└───waiting-to-convert
В папку done сохраняются файлы пропущенные через ffmpeg а в trash файлы после конвертации перемещены оригиналы из waiting-to-convert

Отправлено: 18:23, 29-10-2015 | #3


Ветеран


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

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


Ясно. Теперь надо смотреть на Ваш существующий:
Цитата c4uran:
скрипт cmd »

Отправлено: 18:59, 29-10-2015 | #4


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


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

Профиль | Отправить 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
Благодарности: 8087

Профиль | Отправить 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
Благодарности: 6

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


спасибо! хороший метод правда не проверил еще но идея понятна, я ошибся при переносе скрипта на форум (там мусора много было с комментариями) видимо не заметил

а разве исходная папка не очистится командой move? ааа... понял папки остануться пустыми в итоге, хорошо это сам поправлю

Последний раз редактировалось c4uran, 30-10-2015 в 12:48.


Отправлено: 11:20, 30-10-2015 | #7


Ветеран


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

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


Цитата c4uran:
а разве исходная папка не очистится командой move? »
От папок и файлов, не попадающих под маску — нет.

Отправлено: 13:22, 30-10-2015 | #8


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


Сообщения: 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



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - Сохранение пути при копировании

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
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




 
Переход