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

Кирилл

Команда форума
Администратор
Сообщения
13,736
Реакции
6,126
Баллы
913
Всем привет,я за советом,если можно)))
ТЗ выглядит так:

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

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

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

(через findstr и ftp)

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

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

Dragokas

Very kind Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
6,085
Реакции
5,869
Баллы
648
Через wget или curl в одну строку делается.
И список не нужен. Утиль сам может скачивать все файлы в указанной папке.
 
Последнее редактирование:
  • Like
Реакции: akok

akok

Команда форума
Администратор
Сообщения
16,914
Реакции
13,223
Баллы
2,203
А скрипт затолкать в автозапуск :)
 

Кирилл

Команда форума
Администратор
Сообщения
13,736
Реакции
6,126
Баллы
913
Да,выходит значительно короче,чем множество строк в bat )))
Может даже на VBS пересоберу потом.

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

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

Dragokas

Very kind Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
6,085
Реакции
5,869
Баллы
648
Эта задача от версии ОС не будет зависеть, т.к. WGET / Curl возьмёт это на себя. Там поддержка всей линейки Win XP - 10.
Тебя будет ждать как минимум 2 подводных камня:

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

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

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

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

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

Код для wget:
CMD/BATCH:
wget --ca-certificate=cacert.pem --no-clobber --tries=3 --directory-prefix="download" -i files.txt
Код для Curl:
CMD/BATCH:
@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.
 

Вложения

Кирилл

Команда форума
Администратор
Сообщения
13,736
Реакции
6,126
Баллы
913
Да,я изначально и споткнулся о логин с паролем.
Создали клиентский,это и так нужно было.
Wget я вместо списка пока опробовал -n и -nc.
Но мне кажется так будет больше трафика улетать или нет? На данный момент скрипт буквально в 1 строку работает,затык только в сети внутри компании - там ошибка по итогу,я думаю это проблема уже внутри сети.
Насчет http и сертификатов спасибо,я все мозги чуть не вывихнул...
 

Кирилл

Команда форума
Администратор
Сообщения
13,736
Реакции
6,126
Баллы
913
Dragokas, про прокси не понял-если на системе с которой запущен скрипт не взять прокси то может не работать?
 

Dragokas

Very kind Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
6,085
Реакции
5,869
Баллы
648
На данный момент скрипт буквально в 1 строку работает,затык только в сети внутри компании - там ошибка по итогу,я думаю это проблема уже внутри сети.
Если там весь трафик может течь только через прокси, то wget будет тянуть напрямую, если ей не указать сервер.
Можешь добавить ключ -v, перенаправить вывод в файл >> my.log 2>&1 и посмотреть по логу какого рода там проблема.

На счёт прокси, читаешь с реестра:
CMD/BATCH:
  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:
CMD/BATCH:
  set "ProxyProtocol=-e ftp_proxy=%ProxyServer%"
  set "ProxyProtocol=-e http_proxy=%ProxyServer%"
  set "ProxyProtocol=-e https_proxy=%ProxyServer%"
дальше подставляешь это в средину команды wget:

Код:
wget ...  %wgetProxy% %ProxyProtocol% ...
Wget я вместо списка пока опробовал -n и -nc.
-nc это и есть сокращенный алиас --no-clobber
 

Кирилл

Команда форума
Администратор
Сообщения
13,736
Реакции
6,126
Баллы
913
Оформил примерно так:
CMD/BATCH:
@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
 
  • Like
Реакции: akok

Кирилл

Команда форума
Администратор
Сообщения
13,736
Реакции
6,126
Баллы
913
В процессе масштабного теста возникло две проблемы.
На некоторых пк не выдается диалоговое окно с вопросом и скрипт тупо закрывается.
С чем может быть связано?
И еще дважды возник такой затык:
192.168.***.*.:2080
Нет коннекта
Тоже пока в думках
 

Dragokas

Very kind Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
6,085
Реакции
5,869
Баллы
648
На некоторых пк не выдается диалоговое окно с вопросом и скрипт тупо закрывается.
1. Сработала антивирусная защита.
2. Заблокирован запуск скриптов или повреждено ядро vbscript.
192.168.***.*.:2080
Нет коннекта
Тоже пока в думках
Выглядит, как попытка доступа через прокси. Смотри, что там в настройках. Пробуй через ком. строку вручную подобрать правильную команду.
Может, там ещё какие особые политики запрета/идентификации.
 
Сверху Снизу