2ooth
29-08-2011, 02:55
День добрый. Возникла потребность написания bat файла, выполняющего синхронизацию файлов на фтп сервере с нескольких компьютеров. Поскольку синхронизируемых файлов большое количество (возможно более 200), не имеет смысла заливать их все.
Пример: есть два компьютера: C1 и С2. На С1 есть папка с файлами (допустим С:\reports\), именованными по типу:
User1_blah1.2th
User1_blah2.2th
User2_blah4.2th
User2_blah2.2th
User2_blah4.2th
Файлы начинающиеся с User1 - изменяются только пользователем С1, а файлы User2 - cоответственно пользователем С2 на компьютере С2. При закачке на фтп всего списка файлов, от пользователя С1, на фтп затираются и файлы пользователя С2, даже если они были чуть ранее им обновлены. Было принято решение, сделать отправку, и закачку файлов двумя раздельными bat скриптами (send.bat и get.bat), причем, при отправке c С1 должны отправлятся только файлы пользователей С1 (User1, User3... (пользователей может быть несколько)), а закачиваться только файлы User2, User4, и т.п. соответственно.
Также, на С1, есть папка с профилями, допустим:
С:\profiles\User1.profile.2th
С:\profiles\User3.profile.2th (User3, это не в коем случае никакой не третий компьютер, это просто второй пользователь С1)
В общем:
send.bat
:: выводит список всех пользователей в отдельный файл
dir "С:/profiles" /b>C:\prof.txt
:: по идее, должен бы записать в переменную nm имя User1 (но не записывает). Вопрос 1 - как реализовать? И как реализовать, если пользователей больше чем 1 (важно)?
For /F "Delims=." %%I In (C:\prof.txt) Do set nm=%%I
:: тут всё понятно, подготавливает скрипт списка файлов, для отправки на фтп. Вопрос 2 - список файлов полный, что неприемлимо. Надо отправлять только файлы пользователей С1. Как организовать удаление строк начинающихся с User1 (переменная nm) в файле rep.txt (Также, важно и для других пользователей C1, например User3)
dir "С:\reports\" /b>C:\rep.txt
del /F /Q C:\send.txt 2>nul
for /F "Delims=" %%I in (C:\rep.txt) do echo send "C:\%%I">>C:\send.txt
Имея рабочий send.bat, думаю по его принципу смогу написать и get.bat. Но, тем не менее, был бы очень признателен за помощь в написании и его.. Вопрос опять тот же, как загрузить с фтп файлы с именами User2, отсортировав при этом все файлы все файлы User1.
ps: переименовывать файлы нельзя ни в коем случае, как и пути к ним (рассортировка по папкам), иначе программа отказывается с ними работать.
pss: буду рад комментариям кода, а также другим идеям (может, более простым) выполнения синхронизации, и методам их решения.
Пример: есть два компьютера: C1 и С2. На С1 есть папка с файлами (допустим С:\reports\), именованными по типу:
User1_blah1.2th
User1_blah2.2th
User2_blah4.2th
User2_blah2.2th
User2_blah4.2th
Файлы начинающиеся с User1 - изменяются только пользователем С1, а файлы User2 - cоответственно пользователем С2 на компьютере С2. При закачке на фтп всего списка файлов, от пользователя С1, на фтп затираются и файлы пользователя С2, даже если они были чуть ранее им обновлены. Было принято решение, сделать отправку, и закачку файлов двумя раздельными bat скриптами (send.bat и get.bat), причем, при отправке c С1 должны отправлятся только файлы пользователей С1 (User1, User3... (пользователей может быть несколько)), а закачиваться только файлы User2, User4, и т.п. соответственно.
Также, на С1, есть папка с профилями, допустим:
С:\profiles\User1.profile.2th
С:\profiles\User3.profile.2th (User3, это не в коем случае никакой не третий компьютер, это просто второй пользователь С1)
В общем:
send.bat
:: выводит список всех пользователей в отдельный файл
dir "С:/profiles" /b>C:\prof.txt
:: по идее, должен бы записать в переменную nm имя User1 (но не записывает). Вопрос 1 - как реализовать? И как реализовать, если пользователей больше чем 1 (важно)?
For /F "Delims=." %%I In (C:\prof.txt) Do set nm=%%I
:: тут всё понятно, подготавливает скрипт списка файлов, для отправки на фтп. Вопрос 2 - список файлов полный, что неприемлимо. Надо отправлять только файлы пользователей С1. Как организовать удаление строк начинающихся с User1 (переменная nm) в файле rep.txt (Также, важно и для других пользователей C1, например User3)
dir "С:\reports\" /b>C:\rep.txt
del /F /Q C:\send.txt 2>nul
for /F "Delims=" %%I in (C:\rep.txt) do echo send "C:\%%I">>C:\send.txt
Имея рабочий send.bat, думаю по его принципу смогу написать и get.bat. Но, тем не менее, был бы очень признателен за помощь в написании и его.. Вопрос опять тот же, как загрузить с фтп файлы с именами User2, отсортировав при этом все файлы все файлы User1.
ps: переименовывать файлы нельзя ни в коем случае, как и пути к ним (рассортировка по папкам), иначе программа отказывается с ними работать.
pss: буду рад комментариям кода, а также другим идеям (может, более простым) выполнения синхронизации, и методам их решения.