Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   Сохранение пути при копировании (http://forum.oszone.net/showthread.php?t=307271)

c4uran 29-10-2015 17:00 2569454

Сохранение пути при копировании
 
Дома установлена папка которую проверяет скрипт 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 Тоже подойдут

Iska 29-10-2015 17:33 2569466

Цитата:

Цитата c4uran
визуально выглядит так: »

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

c4uran 29-10-2015 18:23 2569489

До

Код:

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

Iska 29-10-2015 18:59 2569501

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

Цитата c4uran
скрипт cmd »


c4uran 29-10-2015 19:06 2569504

воть
Код:

@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


Iska 30-10-2015 10:51 2569680

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


c4uran 30-10-2015 11:20 2569689

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

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

Iska 30-10-2015 13:22 2569740

Цитата:

Цитата c4uran
а разве исходная папка не очистится командой move? »

От папок и файлов, не попадающих под маску — нет.

c4uran 05-11-2015 14:26 2571882

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

Время: 14:42.
© OSzone.net 2001-