Компьютерный форум 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=332982)

Sergey.l 04-02-2018 13:04 2795715

Скрипт для копирования/перемещения выделенных файлов в заранее указанные каталоги
 
Доброго времени суток!
Друзья, помогите написать скрипт для копирования/перемещения выделенных файлов в указанные заранее каталоги. (больше интересует копирование, а перемещение, укажите, пожалуйста, дополнительно в комментарии)
Конкретно хотел создать кнопочку в Тоталкомандере на вертикальной панели чтобы выделить файлы и нажав на нее файлы копировались/перемещались в указанные в скрипте каталоги

Например
есть два каталога
D:\Телеграммы\2018\02\04\
D:\Почта\отправка\
скрипт должен копировать/перемещать в них выделенные файлы

!важное условие: путь к первому каталогу 2018\02\04 должен быть сформирован через переменные %yyyy%\%mm%\%dd%
для формирования текущей даты использую код от ©megaloman
Скрытый текст
Код:

@Echo Off
cls

SetLocal EnableDelayedExpansion

Call :StrDate "yyyy" "mm" "dd" "hhmm"

Set /A DeltaDay=0
Call :FromNow %DeltaDay% %dd%.%mm%.%yyyy% "yyyyN" "mmN" "ddN"

Set /A DeltaDay=-1
Call :FromNow %DeltaDay% %dd%.%mm%.%yyyy% "yyyyY" "mmY" "ddY"

Set /A DeltaDay=1
Call :FromNow %DeltaDay% %dd%.%mm%.%yyyy% "yyyyT" "mmT" "ddT"

Echo %yyyyN% %mmN% %ddN% Сегодня
Echo %yyyyY% %mmY% %ddY% Вчера
Echo %yyyyT% %mmT% %ddT% Завтра

pause
GoTo :Eof


:StrDate
        FOR /F "tokens=2 delims==." %%d in ('WMIC OS GET LOCALDATETIME /VALUE') DO SET "@Tdate=%%d"
        Set "%~1=%@Tdate:~0,4%"
        Set "%~2=%@Tdate:~4,2%"
        Set "%~3=%@Tdate:~6,2%"
        Set "%~4=%@Tdate:~8,4%"
GoTo :Eof

:FromNow

rem Пересчет даты на заданное кол-во дней
rem Формат даты dd.mm.yyyy +- дни получим новые yyyymmdd

rem Заимствовано http://forum.oszone.net/thread-186889.html
rem вызов Call :FromNow %DeltaDay% %Date% "yyyy" "mm" "dd"
rem результат в перемменной %yyyy% %mm% %dd%

 SetLocal
 Set DT=%2
 Set yyyy=%DT:~-4%& set /a mm=100%DT:~3,2%%%100& set /a dd=100%DT:~,2%%%100
 Set /A JD=%~1+dd-32075+1461*(yyyy+4800+(mm-14)/12)/4+367*(mm-2-(mm-14)/12*12)/12-3*((yyyy+4900+(mm-14)/12)/100)/4
 Set /A L=JD+68569,N=4*L/146097,L=L-(146097*N+3)/4,I=4000*(L+1)/1461001
 Set /A L=L-1461*I/4+31,J=80*L/2447,K=L-2447*J/80,L=J/11
 Set /A J=J+2-12*L,I=100*(N-49)+I+L
 Set /A yyyy=I,mm=100+J,dd=100+K
 EndLocal &(Set %~3=%yyyy%&Set %~4=%mm:~-2%&Set %~5=%dd:~-2%)
GoTo :Eof


semka189 09-02-2018 07:28 2796901

Подпишусь автору.
У меня почти такая же история.
Нужно батник которые скопирует определенные файлы с флешки на диск Д и в папку.
Основные параметры кто сможет написать буду очень благодарен,а название файлов и куда копировать сам впишу.

megaloman 09-02-2018 14:56 2796980

Sergey.l, в Тоталкомандере я не ориентируюсь.
Создайте на этот батник значок на рабочем столе. В проводнике выделите файлы и затащите их на этот значок
Код:

@echo off
cls

Set "BoxArc=Z:\Телеграммы"
Set "BoxOut=Z:\Почта\отправка"

FOR /F "tokens=2 delims==." %%d in ('WMIC OS GET LOCALDATETIME /VALUE') DO SET "Tdate=%%d"
Set "YYYY=%TDate:~0,4%"
Set "MM=%TDate:~4,2%"
Set "DD=%TDate:~6,2%"

If "%~1"=="" (
        Echo !!! Не указаны файлы для обработки &Echo:
        Pause
        Exit /B 240       
)
Set "BoxData=%BoxArc%\%YYYY%\%MM%\%DD%"
Md "%BoxData%" 2>nul
Md "%BoxOut%" 2>nul
 
:Begin
        If "%~1"=="" Pause &GoTo :Eof
        Echo "%~1" &(Copy "%~1" "%BoxOut%\"  >nul &&Move /Y "%~1" "%BoxData%\" >nul)

        Shift
GoTo :Begin

Напоминаю: батник должен быть сохранён в 866 (DOS) кодировке, иначе с русскими символами будут проблемы
Пропишите свои пути.

Если надо именно vbs - js -пишите

Sergey.l 10-02-2018 21:05 2797222

Цитата:

Цитата megaloman
Код:

Set "BoxData=%BoxArc%\%YYYY%\%MM%\%DD%"
Md "%BoxData%" 2>nul
Md "%BoxOut%" 2>nul

»

Спасибо большое. Условие уточню. Я имел ввиду не создавать пути через команду MD c датой, а просто указать их в батнике. для этого нужна маска %yyyy% %mm% %dd% и , пожалуйста, напишите батник на основе вашего кода по формированию даты вчера-сегодня-завтра
Скрытый текст
Код:

@Echo Off
cls

SetLocal EnableDelayedExpansion

Call :StrDate "yyyy" "mm" "dd" "hhmm"

Set /A DeltaDay=0
Call :FromNow %DeltaDay% %dd%.%mm%.%yyyy% "yyyyN" "mmN" "ddN"

Set /A DeltaDay=-1
Call :FromNow %DeltaDay% %dd%.%mm%.%yyyy% "yyyyY" "mmY" "ddY"

Set /A DeltaDay=1
Call :FromNow %DeltaDay% %dd%.%mm%.%yyyy% "yyyyT" "mmT" "ddT"

Echo %yyyyN% %mmN% %ddN% Сегодня
Echo %yyyyY% %mmY% %ddY% Вчера
Echo %yyyyT% %mmT% %ddT% Завтра

pause
GoTo :Eof


:StrDate
        FOR /F "tokens=2 delims==." %%d in ('WMIC OS GET LOCALDATETIME /VALUE') DO SET "@Tdate=%%d"
        Set "%~1=%@Tdate:~0,4%"
        Set "%~2=%@Tdate:~4,2%"
        Set "%~3=%@Tdate:~6,2%"
        Set "%~4=%@Tdate:~8,4%"
GoTo :Eof

:FromNow

rem Пересчет даты на заданное кол-во дней
rem Формат даты dd.mm.yyyy +- дни получим новые yyyymmdd

rem Заимствовано http://forum.oszone.net/thread-186889.html
rem вызов Call :FromNow %DeltaDay% %Date% "yyyy" "mm" "dd"
rem результат в перемменной %yyyy% %mm% %dd%

 SetLocal
 Set DT=%2
 Set yyyy=%DT:~-4%& set /a mm=100%DT:~3,2%%%100& set /a dd=100%DT:~,2%%%100
 Set /A JD=%~1+dd-32075+1461*(yyyy+4800+(mm-14)/12)/4+367*(mm-2-(mm-14)/12*12)/12-3*((yyyy+4900+(mm-14)/12)/100)/4
 Set /A L=JD+68569,N=4*L/146097,L=L-(146097*N+3)/4,I=4000*(L+1)/1461001
 Set /A L=L-1461*I/4+31,J=80*L/2447,K=L-2447*J/80,L=J/11
 Set /A J=J+2-12*L,I=100*(N-49)+I+L
 Set /A yyyy=I,mm=100+J,dd=100+K
 EndLocal &(Set %~3=%yyyy%&Set %~4=%mm:~-2%&Set %~5=%dd:~-2%)
GoTo :Eof


т.к. мне нужна будет дата сегодня-вчера, работаю сутки

Папки с датой в пути уже есть, я создаю такие папки когда прихожу на работу. и в течении дня мне приходиться раскидывать в них файлы в большом количестве.

Sergey.l 11-02-2018 08:28 2797281

megaloman, мне не требуется копировать по дате создания файла. Мне надо перемещать в папку путь к которой выглядит как yyyy\mm\dd. Почему надо сегодня вчера завтра, т.к. путь к папке например 2018\02\11 сегодня, после полуночи это уже вчера, а я работаю сутки. И в конце смены я передаю кое какие док-ты след смене и копирую неск файлов в папку завтра, т.е. 2018\02\12
Понятно, что в одном батнике не сделать чтобы он понимал когда вчера когда завтра, я сделаю три. И в зависимости от времени буду использовать

P.S. есть возможность сделать чтобы выдавался запрос при совпадении файла в перемещаемой директории

megaloman 11-02-2018 13:17 2797301

Sergey.l,
Вот батник. Скопируйте его 3 раза под именами, например, сегодня.bat вчера.bat завтра.bat. Пропишите в зависимости от названия параметр DeltaDay
Код:

@echo off
cls

Set "BoxArc=Z:\Телеграммы"
Set "BoxOut=Z:\Почта\отправка"

rem Set /A DeltaDay  =0 -сегодня;  =1 -завтра; =-1 -вчера
Set /A DeltaDay=-1

If "%~1"=="" (
        Echo !!! Не указаны файлы для обработки &Echo:
        Pause
        Exit /B 240       
)
SetLocal EnableDelayedExpansion
Call :StrDate "yyyy" "mm" "dd"

If Not %DeltaDay%==0 Call :FromNow %DeltaDay% %dd%.%mm%.%yyyy% "yyyy" "mm" "dd"

Set "BoxData=%BoxArc%\%yyyy%\%mm%\%dd%"
Md "%BoxData%" 2>nul
Md "%BoxOut%" 2>nul
 
:Begin
        If "%~1"=="" Pause &GoTo :Eof

        Set SCopy=Copy /-Y "%~1" "%BoxOut%\"
        Set SMove=Move /-Y "%~1" "%BoxData%\"
        Echo %SCopy% &%SCopy% &&(Echo %SMove% &%SMove%)

        Shift
GoTo :Begin

:StrDate
        FOR /F "tokens=2 delims==." %%d in ('WMIC OS GET LOCALDATETIME /VALUE') DO SET "@Tdate=%%d"
        Set "%~1=%@Tdate:~0,4%"
        Set "%~2=%@Tdate:~4,2%"
        Set "%~3=%@Tdate:~6,2%"
GoTo :Eof

:FromNow
        rem Пересчет даты на заданное кол-во дней
        rem Формат даты dd.mm.yyyy +- дни получим новые yyyymmdd

        rem Заимствовано http://forum.oszone.net/thread-186889.html
        rem вызов Call :FromNow %DeltaDay% %Date% "yyyy" "mm" "dd"
        rem результат в перемменной %yyyy% %mm% %dd%

        SetLocal
        Set DT=%2
        Set yyyy=%DT:~-4%& set /a mm=100%DT:~3,2%%%100& set /a dd=100%DT:~,2%%%100
        Set /A JD=%~1+dd-32075+1461*(yyyy+4800+(mm-14)/12)/4+367*(mm-2-(mm-14)/12*12)/12-3*((yyyy+4900+(mm-14)/12)/100)/4
        Set /A L=JD+68569,N=4*L/146097,L=L-(146097*N+3)/4,I=4000*(L+1)/1461001
        Set /A L=L-1461*I/4+31,J=80*L/2447,K=L-2447*J/80,L=J/11
        Set /A J=J+2-12*L,I=100*(N-49)+I+L
        Set /A yyyy=I,mm=100+J,dd=100+K
        EndLocal &(Set %~3=%yyyy%&Set %~4=%mm:~-2%&Set %~5=%dd:~-2%)
GoTo :Eof

Создание папок (Md) вполне можете оставить и не создавать папки руками. Если папки уже имеются, вреда не будет.

Sergey.l 11-02-2018 14:19 2797310

megaloman, спасибо большое!
Почему то переносит по одному файлу, когда выделяю два и более файла!?

Подредактировал так
Скрытый текст
Код:

@echo off
cls

rem Set /A DeltaDay * =0 -сегодня; *=1 -завтра; =-1 -вчера
Set /A DeltaDay=0

If "%~1"=="" (
Echo !!! Не указаны файлы для обработки &Echo:
Pause
Exit /B 240
)
SetLocal EnableDelayedExpansion
Call :StrDate "yyyy" "mm" "dd"

If Not %DeltaDay%==0 Call :FromNow %DeltaDay% %dd%.%mm%.%yyyy% "yyyy" "mm" "dd"

Set "BoxOut=D:\0_TELEGR\%yyyy%\%mm%\%dd%\отправленные\"
Set "BoxArc=D:\DMAIL\send\"

rem Set "BoxData=%BoxArc%\%yyyy%\%mm%\%dd%"
rem Md "%BoxData%" 2>nul
rem Md "%BoxOut%" 2>nul

:Begin
If "%~1"=="" Pause &GoTo :Eof

Set SCopy=Copy /-Y "%~1" "%BoxOut%"
Set SMove=Move /-Y "%~1" "%BoxArc%"
Echo %SCopy% &%SCopy% &&(Echo %SMove% &%SMove%)


Shift
GoTo :Begin

:StrDate
FOR /F "tokens=2 delims==." %%d in ('WMIC OS GET LOCALDATETIME /VALUE') DO SET "@Tdate=%%d"
Set "%~1=%@Tdate:~0,4%"
Set "%~2=%@Tdate:~4,2%"
Set "%~3=%@Tdate:~6,2%"
GoTo :Eof

:FromNow
rem Пересчет даты на заданное кол-во дней
rem Формат даты dd.mm.yyyy +- дни получим новые yyyymmdd

rem Заимствовано http://forum.oszone.net/thread-186889.html
rem вызов Call :FromNow %DeltaDay% %Date% "yyyy" "mm" "dd"
rem результат в перемменной %yyyy% %mm% %dd%

SetLocal
Set DT=%2
Set yyyy=%DT:~-4%& set /a mm=100%DT:~3,2%%%100& set /a dd=100%DT:~,2%%%100
Set /A JD=%~1+dd-32075+1461*(yyyy+4800+(mm-14)/12)/4+367*(mm-2-(mm-14)/12*12)/12-3*((yyyy+4900+(mm-14)/12)/100)/4
Set /A L=JD+68569,N=4*L/146097,L=L-(146097*N+3)/4,I=4000*(L+1)/1461001
Set /A L=L-1461*I/4+31,J=80*L/2447,K=L-2447*J/80,L=J/11
Set /A J=J+2-12*L,I=100*(N-49)+I+L
Set /A yyyy=I,mm=100+J,dd=100+K
EndLocal &(Set %~3=%yyyy%&Set %~4=%mm:~-2%&Set %~5=%dd:~-2%)
GoTo :Eof



P.S. не знаю, но может быть на vbs будет лучше работать

megaloman 11-02-2018 15:58 2797324

Вложений: 1
Цитата:

Цитата Sergey.l
Почему то переносит по одному файлу, когда выделяю два и более файла!? »

Не верю! Строго говоря, переносятся по одному файлу, но за один запуск батника. Картинку прилагаю. Там 59 файлов

Sergey.l 11-02-2018 16:58 2797338

megaloman, действительно, в проводнике все работает с любым количеством файлов. А в тоталкомандере не получается. Закрепил на панели, выделяю правой кнопкой неск файлом, переношу на значек и срабатывает только один файл. Не пойму почему, наверно надо прописать какой то ключ в значке, чтобы действие применялось к выделенным файлам

Sergey.l 11-02-2018 18:05 2797350

megaloman, спасибо еще раз! Разобрался с тотал командером. Прописал в параметрах запуска батника с панели тоталкоммандера ключ %P%S который вставляет имена выделенных файлов с полными путями. Т.е. я просто выделяю перемещаемые файлы и нажимаю кнопку! Супер!


Время: 23:00.

Время: 23:00.
© OSzone.net 2001-