Показать полную графическую версию : [решено] Скрипт для копирования/перемещения выделенных файлов в заранее указанные каталоги
Sergey.l
04-02-2018, 13:04
Доброго времени суток!
Друзья, помогите написать скрипт для копирования/перемещения выделенных файлов в указанные заранее каталоги. (больше интересует копирование, а перемещение, укажите, пожалуйста, дополнительно в комментарии)
Конкретно хотел создать кнопочку в Тоталкомандере на вертикальной панели чтобы выделить файлы и нажав на нее файлы копировались/перемещались в указанные в скрипте каталоги
Например
есть два каталога
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
Подпишусь автору.
У меня почти такая же история.
Нужно батник которые скопирует определенные файлы с флешки на диск Д и в папку.
Основные параметры кто сможет написать буду очень благодарен,а название файлов и куда копировать сам впишу.
megaloman
09-02-2018, 14:56
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
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
megaloman, мне не требуется копировать по дате создания файла. Мне надо перемещать в папку путь к которой выглядит как yyyy\mm\dd. Почему надо сегодня вчера завтра, т.к. путь к папке например 2018\02\11 сегодня, после полуночи это уже вчера, а я работаю сутки. И в конце смены я передаю кое какие док-ты след смене и копирую неск файлов в папку завтра, т.е. 2018\02\12
Понятно, что в одном батнике не сделать чтобы он понимал когда вчера когда завтра, я сделаю три. И в зависимости от времени буду использовать
P.S. есть возможность сделать чтобы выдавался запрос при совпадении файла в перемещаемой директории
megaloman
11-02-2018, 13:17
Sergey.l, @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
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
Почему то переносит по одному файлу, когда выделяю два и более файла!? » Не верю! Строго говоря, переносятся по одному файлу, но за один запуск батника. Картинку прилагаю. Там 59 файлов
Sergey.l
11-02-2018, 16:58
megaloman, действительно, в проводнике все работает с любым количеством файлов. А в тоталкомандере не получается. Закрепил на панели, выделяю правой кнопкой неск файлом, переношу на значек и срабатывает только один файл. Не пойму почему, наверно надо прописать какой то ключ в значке, чтобы действие применялось к выделенным файлам
Sergey.l
11-02-2018, 18:05
megaloman, спасибо еще раз! Разобрался с тотал командером. Прописал в параметрах запуска батника с панели тоталкоммандера ключ %P%S который вставляет имена выделенных файлов с полными путями. Т.е. я просто выделяю перемещаемые файлы и нажимаю кнопку! Супер!
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.