Скачивание файлов с автообновлением из папки на FTP

Тема в разделе "Пакетные файлы CMD, BAT", создана пользователем Кирилл, 14 мар 2017.

  1. Кирилл

    Кирилл Команда форума Администратор

    Сообщения:
    12.986
    Симпатии:
    5.628
    Всем привет,я за советом,если можно)))
    ТЗ выглядит так:

    Есть неопределенное количество клиентских ПК и есть сервер с FTP
    На FTP лежат картинки,которые надо закачивать на клиентские ПК.

    Так как картинок очень много и не хочется их качать постоянно,то существует автоматически обновляемый список в виде файлика.

    Нужно скачивать файл при каждом запуске скрипта на клиентском ПК и сравнивать с предыдущим файлом.
    Получая разницу докачиваем с FTP все по полученному из разницы списку.

    (через findstr и ftp)

    Вроде бы все решаемо,но перед тем как заморочиться хотел посоветоваться - какие то подводные камни мне грозят?
    Используемые ОС - все винда,от ХР до 10

    Почему скрипт? Потому что готовый софт настроить будет очень сложно для людей с очень разными знаниями и раскиданными территориально на сотни километров,а порой и на тысячи.
    Писать свою программу - рано или поздно словим детект,который сыграет злую шутку.
    Поэтому скрипт.
    Запустил и все.
     
    akok нравится это.
  2. Dragokas

    Dragokas Very kind Developer Команда форума Супер-Модератор Разработчик Клуб переводчиков

    Сообщения:
    5.331
    Симпатии:
    5.235
    Через wget или curl в одну строку делается.
    И список не нужен. Утиль сам может скачивать все файлы в указанной папке.
     
    Последнее редактирование: 14 мар 2017
    akok нравится это.
  3. akok

    akok Команда форума Администратор

    Лучший автор месяца

    Сообщения:
    13.752
    Симпатии:
    14.955
    А скрипт затолкать в автозапуск :)
     
  4. Кирилл

    Кирилл Команда форума Администратор

    Сообщения:
    12.986
    Симпатии:
    5.628
    Да,выходит значительно короче,чем множество строк в bat )))
    Может даже на VBS пересоберу потом.

    Остановился на wget,но главный вопрос пока актуален:

    Какие затыки меня могут ожидать на разных ОС? Или код, скажем, между ХР, 10 и server будет един?
    Особенности работы систем? Если честно очень давно не работал ни с чем,кроме 7 и 8 ,поэтому и интересуюсь.
     
  5. Severnyj

    Severnyj Команда форума Супер-Модератор Ассоциация VN/VIP

    Сообщения:
    8.447
    Симпатии:
    9.210
    10-ка от них очень мало чем отличается
     
    Кирилл нравится это.
  6. Dragokas

    Dragokas Very kind Developer Команда форума Супер-Модератор Разработчик Клуб переводчиков

    Сообщения:
    5.331
    Симпатии:
    5.235
    Эта задача от версии ОС не будет зависеть, т.к. WGET / Curl возьмёт это на себя. Там поддержка всей линейки Win XP - 10.
    Тебя будет ждать как минимум 2 подводных камня:

    1) Сертификат
    2) Прокси-сервер

    1) Если у сервера, откуда ты будешь качать, протокол HTTPS и установлены сертификаты, которые не знакомы этим утилитам, они не смогут скачать файл.

    Поэтому для Curl нужно положить рядом файл-список сертификатов, скачанный, например, отсюда.
    Для WGET потребуется её последняя версия, затем указать тот же фал список ключом --ca-certificate=FILE

    В приложенных архивах я это учёл.

    2) Прокси-сервер нужно читать из настроек системы, и подставлять утилите.
    Если тебе это нужно, то добавлю к коду.

    Код для wget:
    Код (DOS):

    wget --ca-certificate=cacert.pem --no-clobber --tries=3 --directory-prefix="download" -i files.txt
     
    Код для Curl:
    Код (DOS):

    @echo off
    SetLocal EnableExtensions

    md "download" 2>NUL
    cd "download"

    for /f "UseBackQ" %%a in ("..\files.txt") do call :Download "%%a"
    pause

    :Download [http-file]
      call :GetLastToken "%~1"
      if not exist "%ret%" (
        echo Downloading: "%~1"
        ..\curl -# --cacert "..\cacert.pem" -O "%~1"
      )
    exit /b

    :GetLastToken [string]
      for /f "tokens=1* delims=/" %%a in ("%~1") do if "%%b"=="" (set "ret=%%a") else (call :GetLastToken "%%b")
    exit /b
     
    Скачивать будет в папку "download". Уже скачанные файлы будет пропускать.
    Список файлов "files.txt" с полными путями нужно положить рядом.
    Утилиты с сертификатами и демкой выложил в архиве ниже.
    Здесь я ошибся. Так может делать только wget, и то только с учётом что ссылки на эти файлы будут находится в теле одного из html-файлов.
    Либо утилю придётся указывать логин/пароль FTP.
     

    Вложения:

    • DLFile.zip
      Размер файла:
      3,3 МБ
      Просмотров:
      3
    Кирилл нравится это.
  7. Кирилл

    Кирилл Команда форума Администратор

    Сообщения:
    12.986
    Симпатии:
    5.628
    Да,я изначально и споткнулся о логин с паролем.
    Создали клиентский,это и так нужно было.
    Wget я вместо списка пока опробовал -n и -nc.
    Но мне кажется так будет больше трафика улетать или нет? На данный момент скрипт буквально в 1 строку работает,затык только в сети внутри компании - там ошибка по итогу,я думаю это проблема уже внутри сети.
    Насчет http и сертификатов спасибо,я все мозги чуть не вывихнул...
     
  8. Кирилл

    Кирилл Команда форума Администратор

    Сообщения:
    12.986
    Симпатии:
    5.628
    Dragokas, про прокси не понял-если на системе с которой запущен скрипт не взять прокси то может не работать?
     
  9. Dragokas

    Dragokas Very kind Developer Команда форума Супер-Модератор Разработчик Клуб переводчиков

    Сообщения:
    5.331
    Симпатии:
    5.235
    Если там весь трафик может течь только через прокси, то wget будет тянуть напрямую, если ей не указать сервер.
    Можешь добавить ключ -v, перенаправить вывод в файл >> my.log 2>&1 и посмотреть по логу какого рода там проблема.

    На счёт прокси, читаешь с реестра:
    Код (DOS):

      for %%N in (ProxyServer ProxyOverride ProxyEnable) do For /F "Tokens=2*" %%A In ('Reg.exe Query "%hive%" ^| Find /I "%%N"') do set "%%N=%%B"
      if "%ProxyEnable%"=="0x1" set "wgetProxy=-e use_proxy=yes"
     
    затем выбираешь одну из переменных в зависимости от того, по какому ты адресу скачивать будешь ftp, http или https:
    Код (DOS):

      set "ProxyProtocol=-e ftp_proxy=%ProxyServer%"
      set "ProxyProtocol=-e http_proxy=%ProxyServer%"
      set "ProxyProtocol=-e https_proxy=%ProxyServer%"
     
    дальше подставляешь это в средину команды wget:

    Код (Text):
    wget ...  %wgetProxy% %ProxyProtocol% ...
    -nc это и есть сокращенный алиас --no-clobber
     
    Кирилл нравится это.
  10. Кирилл

    Кирилл Команда форума Администратор

    Сообщения:
    12.986
    Симпатии:
    5.628
    Оформил примерно так:
    Код (DOS):
    @echo off

    title ***
    cd /d "%~dp0"
    chcp 866 >nul

    :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::


    set m.msg=^
      Скачать свежие фото и описания товаров каталога ? ^&^ ^&^
      Нажмите ДА если согласны начать загрузку ^&^
      Нажмите НЕТ для отмены операции
        cmd /U /C echo Wscript.Echo Msgbox^(replace^(Wscript.Arguments^(0^),"&",vbLF^),68,"Внимание!"^)>"msgbox.vbs"
            for /f %%a in ('cscript "msgbox.vbs" "%m.msg%"^& del "msgbox.vbs"') do set err=%%a
                if "%err%"=="2"  call :GoOc
                if "%err%"=="6"  call :GoOc & call :arbite
                if "%err%"=="7"  call :GoOc
         exit /b
     
    :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::  

     
    :arbite
       set hive=HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings
       for %%N in (ProxyServer ProxyOverride ProxyEnable) do For /F "Tokens=2*" %%A In ('Reg.exe Query "%hive%" ^| Find /I "%%N"') do set "%%N=%%B"
        if "%ProxyEnable%"=="0x1" set "wgetProxy=-e use_proxy=yes"
         set "ProxyProtocol=-e ftp_proxy=%ProxyServer%"
       ::set "ProxyProtocol=-e http_proxy=%ProxyServer%"
       ::set "ProxyProtocol=-e https_proxy=%ProxyServer%"
       wget -P "%~dp0/Images" %wgetProxy% %ProxyProtocol% --user=clients --password=**** -A jpg -nc --progress=bar:force ftp://*****/images/*
       wget -P "%~dp0/Docs" %wgetProxy% %ProxyProtocol% --user=clients --password=**** -A rtf -nc --progress=bar:force ftp://******/docs/*
     
    exit /b

    :GoOc
        start Cat.exe
       
    exit /B
     
     
    akok нравится это.
  11. Кирилл

    Кирилл Команда форума Администратор

    Сообщения:
    12.986
    Симпатии:
    5.628
    В процессе масштабного теста возникло две проблемы.
    На некоторых пк не выдается диалоговое окно с вопросом и скрипт тупо закрывается.
    С чем может быть связано?
    И еще дважды возник такой затык:
    192.168.***.*.:2080
    Нет коннекта
    Тоже пока в думках
     
  12. Dragokas

    Dragokas Very kind Developer Команда форума Супер-Модератор Разработчик Клуб переводчиков

    Сообщения:
    5.331
    Симпатии:
    5.235
    1. Сработала антивирусная защита.
    2. Заблокирован запуск скриптов или повреждено ядро vbscript.
    Выглядит, как попытка доступа через прокси. Смотри, что там в настройках. Пробуй через ком. строку вручную подобрать правильную команду.
    Может, там ещё какие особые политики запрета/идентификации.
     
    Кирилл нравится это.
Загрузка...
Похожие темы - Скачивание файлов автообновлением
  1. oniava
    Ответов:
    15
    Просмотров:
    460
  2. AvantCV
    Ответов:
    2
    Просмотров:
    520
  3. valerex
    Ответов:
    1
    Просмотров:
    881
  4. SOulfly13
    Ответов:
    6
    Просмотров:
    1.053
  5. Паразит
    Ответов:
    3
    Просмотров:
    643
  6. Dragokas
    Ответов:
    10
    Просмотров:
    25.171

Поделиться этой страницей

Загрузка...