|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - Батник копирующий и перемещающий файлы по маске в заданные каталоги |
|
|
CMD/BAT - Батник копирующий и перемещающий файлы по маске в заданные каталоги
|
Новый участник Сообщения: 24 |
Доброго времени суток!
С написанием батников знаком, но не очень силен Есть батник написанный мной: @Echo On setlocal enableextensions enabledelayedexpansion cls path c:\windows\system32 Set sourcedir=e:\Rabota\GNI\OUT\ Set sourcedir1=e:\Rabota\GNI\OUT\A\ Set sourcedir2=e:\Rabota\GNI\OUT\AN\ Set sourcedir3=e:\Rabota\GNI\OUT\BN\ Set sourcedir_arh=e:\Rabota\GNI\OUT\Arhiv\ Set destdir1=d:\Rabota\GNI_Test\ARHIV\ Set destdir2=e:\Rabota\GNI\ARHIV\ Set log=d:\Rabota\GNI_Test\Log\ Set files1=SBC*.txt Set files2=SBC*.xml Set files3=SFC*.xml for /f "tokens=1-3*" %%a in ('dir "%sourcedir%%files1%" /b /s /a-d') do ( if %%a==%files1% Exist ( if not exist "%destdir1%%Date%\ES\A" md "%destdir1%%Date%\ES\A" if not exist "%destdir2%%Date%\ES\A" md "%destdir2%%Date%\ES\A" if not exist "%sourcedir_arh%%Date%\ES\A" md "%sourcedir_arh%%Date%\ES\A" xcopy %%a %destdir1%%Date%\ES\A\ /H /Y /C /R /S /Z /EXCLUDE:d:\Rabota\GNI_test\listnotcopy.txt xcopy %%a %destdir2%%Date%\ES\A\ /H /Y /C /R /S /Z /EXCLUDE:d:\Rabota\GNI_test\listnotcopy.txt >> %log%log_%date%.txt Date /t >> %log%log_%date%.txt Time /t >> %log%log_%date%.txt ) move %sourcedir1%%files1% "%sourcedir_arh%"%Date%\ES\A\ >> %log%log_%date%.txt Date /t >> %log%log_%date%.txt Time /t >> %log%log_%date%.txt ) else ( for /f "tokens=1-3*" %%b in ('dir "%sourcedir%%files2%" /b /s /a-d') do ( if %%b==%files2% Exist ( if not exist "%destdir1%%Date%\ES\AN" md "%destdir1%%Date%\ES\AN" if not exist "%destdir2%%Date%\ES\AN" md "%destdir2%%Date%\ES\AN" if not exist "%sourcedir_arh%%Date%\ES\AN" md "%sourcedir_arh%%Date%\ES\AN" xcopy %%b %destdir1%%Date%\ES\AN\ /H /Y /C /R /S /Z /EXCLUDE:d:\Rabota\GNI_test\listnotcopy.txt xcopy %%b %destdir2%%Date%\ES\AN\ /H /Y /C /R /S /Z /EXCLUDE:d:\Rabota\GNI_test\listnotcopy.txt >> %log%log_%date%.txt Date /t >> %log%log_%date%.txt Time /t >> %log%log_%date%.txt ) move %sourcedir2%%files2% "%sourcedir_arh%"%Date%\ES\AN\ >> %log%log_%date%.txt Date /t >> %log%log_%date%.txt Time /t >> %log%log_%date%.txt ) else ( for /f "tokens=1-3*" %%c in ('dir "%sourcedir%%files3%" /b /s /a-d') do ( if %%c==%files3% Exist ( if not exist "%destdir1%%Date%\ES\BN" md "%destdir1%%Date%\ES\BN" if not exist "%destdir2%%Date%\ES\BN" md "%destdir2%%Date%\ES\BN" if not exist "%sourcedir_arh%%Date%\ES\BN" md "%sourcedir_arh%%Date%\ES\BN" xcopy %%c %destdir1%%Date%\ES\BN\ /H /Y /C /R /S /Z /EXCLUDE:d:\Rabota\GNI_test\listnotcopy.txt xcopy %%c %destdir2%%Date%\ES\BN\ /H /Y /C /R /S /Z /EXCLUDE:d:\Rabota\GNI_test\listnotcopy.txt >> %log%log_%date%.txt Date /t >> %log%log_%date%.txt Time /t >> %log%log_%date%.txt ) move %sourcedir3%%files3% "%sourcedir_arh%"%Date%\ES\BN\ >> %log%log_%date%.txt Date /t >> %log%log_%date%.txt Time /t >> %log%log_%date%.txt ) if not exist "%destdir1%%Date%\TF" md "%destdir1%%Date%\TF" >> %log%log_%date%.txt Date /t >> %log%log_%date%.txt Time /t >> %log%log_%date%.txt Он просматривает каталог с подкаталогами на наличие файлов и копирует/перемещает файлы с определенной маской в определенный подкаталог. Т.е. производит разбор файлов по каталогам. Помогите пожалуйста исправить или дописать его так, чтобы батник сканировал все файлы в каталоге с масками (не зависимо от подкаталога где этот файл лежит) и сортировал их (копировал/перемещал) в другое место в определенные подкаталоги. Так же хотелось бы ускорить работу этого батника. |
|
Отправлено: 22:47, 06-08-2014 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать |
Отправлено: 22:59, 06-08-2014 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Новый участник Сообщения: 24
|
Профиль | Отправить PM | Цитировать Код работал, сортировка проводилась.
@Echo On setlocal enableextensions enabledelayedexpansion cls path c:\windows\system32 Set sourcedir=e:\Rabota\GNI\OUT\ Set sourcedir1=e:\Rabota\GNI\OUT\A\ Set sourcedir2=e:\Rabota\GNI\OUT\AN\ Set sourcedir3=e:\Rabota\GNI\OUT\BN\ Set sourcedir_arh=e:\Rabota\GNI\OUT\Arhiv\ Set destdir1=d:\Rabota\GNI_Test\ARHIV\ Set destdir2=e:\Rabota\GNI\ARHIV\ Set log=d:\Rabota\GNI_Test\Log\ Set files1=SBC*.txt Set files2=SBC*.xml Set files3=SFC*.xml for /f "tokens=1-3*" %%a in ('dir "%sourcedir%%files1%" /b /s /a-d') do ( if %%a==%files1% Exist ( if not exist "%destdir1%%Date%\ES\A" md "%destdir1%%Date%\ES\A" if not exist "%destdir2%%Date%\ES\A" md "%destdir2%%Date%\ES\A" if not exist "%sourcedir_arh%%Date%\ES\A" md "%sourcedir_arh%%Date%\ES\A" xcopy %%a %destdir1%%Date%\ES\A\ /H /Y /C /R /S /Z /EXCLUDE:d:\Rabota\GNI_test\listnotcopy.txt xcopy %%a %destdir2%%Date%\ES\A\ /H /Y /C /R /S /Z /EXCLUDE:d:\Rabota\GNI_test\listnotcopy.txt >> %log%log_%date%.txt Date /t >> %log%log_%date%.txt Time /t >> %log%log_%date%.txt ) move %sourcedir1%%files1% "%sourcedir_arh%"%Date%\ES\A\ >> %log%log_%date%.txt Date /t >> %log%log_%date%.txt Time /t >> %log%log_%date%.txt ) else ( for /f "tokens=1-3*" %%b in ('dir "%sourcedir%%files2%" /b /s /a-d') do ( if %%b==%files2% Exist ( if not exist "%destdir1%%Date%\ES\AN" md "%destdir1%%Date%\ES\AN" if not exist "%destdir2%%Date%\ES\AN" md "%destdir2%%Date%\ES\AN" if not exist "%sourcedir_arh%%Date%\ES\AN" md "%sourcedir_arh%%Date%\ES\AN" xcopy %%b %destdir1%%Date%\ES\AN\ /H /Y /C /R /S /Z /EXCLUDE:d:\Rabota\GNI_test\listnotcopy.txt xcopy %%b %destdir2%%Date%\ES\AN\ /H /Y /C /R /S /Z /EXCLUDE:d:\Rabota\GNI_test\listnotcopy.txt >> %log%log_%date%.txt Date /t >> %log%log_%date%.txt Time /t >> %log%log_%date%.txt ) move %sourcedir2%%files2% "%sourcedir_arh%"%Date%\ES\AN\ >> %log%log_%date%.txt Date /t >> %log%log_%date%.txt Time /t >> %log%log_%date%.txt ) else ( for /f "tokens=1-3*" %%c in ('dir "%sourcedir%%files3%" /b /s /a-d') do ( if %%c==%files3% Exist ( if not exist "%destdir1%%Date%\ES\BN" md "%destdir1%%Date%\ES\BN" if not exist "%destdir2%%Date%\ES\BN" md "%destdir2%%Date%\ES\BN" if not exist "%sourcedir_arh%%Date%\ES\BN" md "%sourcedir_arh%%Date%\ES\BN" xcopy %%c %destdir1%%Date%\ES\BN\ /H /Y /C /R /S /Z /EXCLUDE:d:\Rabota\GNI_test\listnotcopy.txt xcopy %%c %destdir2%%Date%\ES\BN\ /H /Y /C /R /S /Z /EXCLUDE:d:\Rabota\GNI_test\listnotcopy.txt >> %log%log_%date%.txt Date /t >> %log%log_%date%.txt Time /t >> %log%log_%date%.txt ) move %sourcedir3%%files3% "%sourcedir_arh%"%Date%\ES\BN\ >> %log%log_%date%.txt Date /t >> %log%log_%date%.txt Time /t >> %log%log_%date%.txt ) if not exist "%destdir1%%Date%\TF" md "%destdir1%%Date%\TF" >> %log%log_%date%.txt Date /t >> %log%log_%date%.txt Time /t >> %log%log_%date%.txt |
Отправлено: 00:03, 07-08-2014 | #3 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать |
Отправлено: 00:37, 07-08-2014 | #4 |
Новый участник Сообщения: 24
|
Профиль | Отправить PM | Цитировать Else предполагалось использовать с оператором "IF", а не с командой "For".
Ошибка вышла со скобками. Потому то, что с "else", что без "else" и выполняется у меня одинаково. "Else" я убрал. Так вроде бы все работает. Не поможете довести до ума код? @Echo On setlocal enableextensions enabledelayedexpansion cls path c:\windows\system32 Set sourcedir=c:\Rabota\GNI\OUT\ Set sourcedir1=c:\Rabota\GNI\OUT\A\ Set sourcedir2=c:\Rabota\GNI\OUT\AN\ Set sourcedir3=c:\Rabota\GNI\OUT\BN\ Set sourcedir_arh=c:\Rabota\GNI\OUT\Arhiv\ Set destdir1=d:\Rabota\GNI\ARHIV\ Set destdir2=c:\Rabota\GNI\ARHIV\ Set log=d:\Rabota\GNI\Log\ Set files1=SBC*.txt Set files2=SBC*.xml Set files3=SFC*.xml for /f "tokens=1-3*" %%a in ('dir "%sourcedir%%files1%" /b /s /a-d') do ( if %%a==%files1% Exist ( if not exist "%destdir1%%Date%\ES\A" md "%destdir1%%Date%\ES\A" if not exist "%destdir2%%Date%\ES\A" md "%destdir2%%Date%\ES\A" if not exist "%sourcedir_arh%%Date%\ES\A" md "%sourcedir_arh%%Date%\ES\A" xcopy %%a %destdir1%%Date%\ES\A\ /H /Y /C /R /S /Z /EXCLUDE:d:\Rabota\GNI\listnotcopy.txt xcopy %%a %destdir2%%Date%\ES\A\ /H /Y /C /R /S /Z /EXCLUDE:d:\Rabota\GNI\listnotcopy.txt >> %log%log_%date%.txt Date /t >> %log%log_%date%.txt Time /t >> %log%log_%date%.txt ) move %sourcedir1%%files1% "%sourcedir_arh%"%Date%\ES\A\ >> %log%log_%date%.txt Date /t >> %log%log_%date%.txt Time /t >> %log%log_%date%.txt ) for /f "tokens=1-3*" %%b in ('dir "%sourcedir%%files2%" /b /s /a-d') do ( if %%b==%files2% Exist ( if not exist "%destdir1%%Date%\ES\AN" md "%destdir1%%Date%\ES\AN" if not exist "%destdir2%%Date%\ES\AN" md "%destdir2%%Date%\ES\AN" if not exist "%sourcedir_arh%%Date%\ES\AN" md "%sourcedir_arh%%Date%\ES\AN" xcopy %%b %destdir1%%Date%\ES\AN\ /H /Y /C /R /S /Z /EXCLUDE:d:\Rabota\GNI\listnotcopy.txt xcopy %%b %destdir2%%Date%\ES\AN\ /H /Y /C /R /S /Z /EXCLUDE:d:\Rabota\GNI\listnotcopy.txt >> %log%log_%date%.txt Date /t >> %log%log_%date%.txt Time /t >> %log%log_%date%.txt ) move %sourcedir2%%files2% "%sourcedir_arh%"%Date%\ES\AN\ >> %log%log_%date%.txt Date /t >> %log%log_%date%.txt Time /t >> %log%log_%date%.txt ) for /f "tokens=1-3*" %%c in ('dir "%sourcedir%%files3%" /b /s /a-d') do ( if %%c==%files3% Exist ( if not exist "%destdir1%%Date%\ES\BN" md "%destdir1%%Date%\ES\BN" if not exist "%destdir2%%Date%\ES\BN" md "%destdir2%%Date%\ES\BN" if not exist "%sourcedir_arh%%Date%\ES\BN" md "%sourcedir_arh%%Date%\ES\BN" xcopy %%c %destdir1%%Date%\ES\BN\ /H /Y /C /R /S /Z /EXCLUDE:d:\Rabota\GNI\listnotcopy.txt xcopy %%c %destdir2%%Date%\ES\BN\ /H /Y /C /R /S /Z /EXCLUDE:d:\Rabota\GNI\listnotcopy.txt >> %log%log_%date%.txt Date /t >> %log%log_%date%.txt Time /t >> %log%log_%date%.txt ) move %sourcedir3%%files3% "%sourcedir_arh%"%Date%\ES\BN\ >> %log%log_%date%.txt Date /t >> %log%log_%date%.txt Time /t >> %log%log_%date%.txt ) if not exist "%destdir1%%Date%\TF" md "%destdir1%%Date%\TF" >> %log%log_%date%.txt Date /t >> %log%log_%date%.txt Time /t >> %log%log_%date%.txt Т.е. файл с маской "files1" копировался/перемещался бы в каталог A, файл с маской "files2" копировался/перемещался бы в каталог AN, файл с маской "files3" копировался/перемещался бы в каталог BN |
|
Отправлено: 08:45, 07-08-2014 | #5 |
Ветеран Сообщения: 2728
|
Профиль | Отправить PM | Цитировать KamikadZZe,
Цитата:
Как понял задачу, такое и предлагаю решение, подвиг уважаемого Iska, вникнувшего в Ваш код, повторить не берусь. Лучше бы Вы описали задачу с чистого листа. @Echo Off Set LogFile=%0.log Call :MoveSub "Q:\From1" "*.xls" "Q:\Out1" Call :MoveSub "Q:\From2" "*.d*" "Q:\Out2" Call :MoveSub "Q:\From3" "*file1*.*" "Q:\Out3" Call :MoveSub "Q:\From4" "*file2*.*" "Z:\Out4" GoTo :Eof :MoveSub If Not Exist %3 md %3 If Not Exist %3 ( Echo %Date% %Time% Папка %3 не создана >>"%LogFile%" GoTo :Eof ) FOR /F "usebackq delims=" %%i IN (`Dir /b /s /A:-D "%~1\%~2" 2^>Nul`) DO ( Move /Y "%%i" "%~3\" If Exist "%~3\%%~nxi" ( Echo %Date% %Time% "%%i" --^> "%~3\%%~nxi" >>"%LogFile%" ) Else ( Echo %Date% %Time% "%%i" переместить не удалось ) ) |
|
------- Последний раз редактировалось megaloman, 07-08-2014 в 11:30. Отправлено: 10:24, 07-08-2014 | #6 |
Ушёл из жизни Сообщения: 6021
|
Профиль | Отправить PM | Цитировать Цитата megaloman:
![]() Я тоже не смог понять синтаксис таких строк: |
|
Отправлено: 19:25, 07-08-2014 | #7 |
Новый участник Сообщения: 24
|
Профиль | Отправить PM | Цитировать Задание такого рода:
Допустим есть файлы: SBCXXXXXXX_XXXXXXXXXX_XXXXXXXXXX_XXX.txt, SBCXXXXXXX_XXXXXXXXXX_XXXXXXXXXX_XXX.xml, SBFXXXXXXX_XXXXXXXXXX_XXXXXXXXXX_XXX.xml. Они создаются программой и выкладываются подкаталоги "A", "AN", "BN" в общем каталоге "GNI" на сервере ( в "A"->sbc*.txt и т.д. по порядку) В папке "GNI" на сервере есть еще подкаталог "Arhiv" в который перемещаются скопированные файлы. Вначале стояла задача копировать эти файлы на 2-а других компа по сети в папку "GNI" сохраняя подкаталоги, а затем перемещать эти файлы в "Arhiv". Чтобы исключить перекопирование подкаталога "Arhiv" в xcopy был добавлен listnotcopy.txt. В должно осуществляться сравнение файла по маске и затем, если файл совпадает с маской, т.е. файл в каталоге на сервере SBCXXXXXXX_XXXXXXXXXX_XXXXXXXXXX_XXX.txt совпадает с маской, то создается подкаталог на компах и происходит копирование этого файла в созданый подкаталог. Если файла нет или не совпадает с маской то подкаталог не создается. На сравнение, копирование файлов по маске в коде приведенном мной уходит не менее 2-х-5 мин, т.к. в подкаталоге "Arhiv" много файлов. Хотелось бы ускорить этот процесс. Т.к. не исключено что после обновления программа потеряет пути (случалось такое) и выгрузит файлы в корень "GNI" или что хуже перепутает подкаталоги для выгрузки хотелось бы чтобы код проверял каталог "GNI" вместе с подкаталогами (т.е. "A"-> на наличае файлов по маскам sbc.txt, sbc.xml, sbf.xml,"AN" -> на наличае файлов по маскам sbc.txt, sbc.xml, sbf.xml, "BN"-> на наличае файлов по маскам sbc.txt, sbc.xml, sbf.xml), создавал подкаталоги если имеются файлы совпадающие с маской и копировал их в определенные подкаталоги (т.е. в "A"-> только файлы sbc.txt, "AN" -> только файлы sbc.xml, "BN"-> только файлы sbf.xml ). |
Последний раз редактировалось KamikadZZe, 08-08-2014 в 00:06. Отправлено: 23:42, 07-08-2014 | #8 |
Новый участник Сообщения: 9
|
Профиль | Отправить PM | Цитировать Знала бы налоговая что вы с их файлами творите...
у меня все файлы идут по умолчанию в А про маску: call :movefilter 3 b call :movefilter 4 b call :movefilter ? a :movefilter move /y "%MSG_out_folder%SEND\SBC*_%1??.txt" "%script_root%%2\" >> "%script_root%logs\311p.log" exit /b т.е если %1 будет 3 или 4 то в B , прочее идет в А. про AN - сделал отдельным аналогичным батником , нисколько не жалею но самый интересный вопрос - зачем вам и старый и новый метод сообщений в налоговую? разве сейчас все масссово не переходят на хмл ? |
Отправлено: 08:40, 08-08-2014 | #9 |
Ветеран Сообщения: 2728
|
Профиль | Отправить PM | Цитировать KamikadZZe, что не устраивает в моём решении? Объясните, если смогу, доработаю ... Если каталоги на одном диске, применение Move вместо XCopy существенно должно ускорить процесс, тем более что Вы просили переместить файлы.
|
------- Отправлено: 18:53, 08-08-2014 | #10 |
|
![]() |
Участник сейчас на форуме |
![]() |
Участник вне форума |
![]() |
Автор темы |
![]() |
Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
CMD/BAT - [решено] Помогите написать батник, копирующий файлы по дате изменения | kirillius | Скриптовые языки администрирования Windows | 4 | 22-07-2014 17:31 | |
.NET - Скачать файлы с ftp по маске. | Sadhacker | Программирование и базы данных | 1 | 20-07-2012 21:23 | |
CMD/BAT - [решено] Нужен батник копирующий текущий ip в буфер обмена | Absolutus11 | Скриптовые языки администрирования Windows | 2 | 23-04-2012 15:22 | |
CMD/BAT - [решено] Батник копирующий из папок в сети файлы в одну | Nenomernoj | Скриптовые языки администрирования Windows | 11 | 16-01-2012 18:23 | |
Удалить файлы в папке по маске | Nealles | Программирование и базы данных | 4 | 10-09-2003 23:11 |
|