Автор Тема: [Сеть, интернет] Автоматизация загрузки файла с ФТП сервера и дальнейшая работа с ним  (Прочитано 584 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Эта тема содержит сообщение, помеченное как лучший ответ. Кликните здесь для перехода к этому сообщению.

Оффлайн Alsagas [?]

  • Новичок
  • *
  • Сообщений: 15
  • Репутация: 0
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.x.x
Версия AutoIt: 3.3.14.2

Описание: Добрый день, уважаемые специалисты. Помогите, пожалуйста с написанием скрипта для автоматической загрузки рекламного ролика с фпт сервера и его последующего запуска.

Подробное описание:
На компе есть локальная папка D:\Реклама, там лежит файл файл.pps, который круглосуточно крутится на рекламных мониторах у нас на предприятии. Раз в месяц происходит замена рекламного файла на новый, который выкладывается на ФТп сервер, который находится в головном офисе. Тут и все, в принципе, но есть одна заковыка, файл просто так не перезаписать, так как он в это время работает и система его зашищает от перезаписи. Приходится заходить удаленно, завершать процесс и только потом заливать этот файл и запускать его. Ярлык файла лежит в автозагрузке для того, чтобы при рестарте компа он запускался автоматом.
 
Что бы хотелось увидеть:
1. Ежедневный заход на фтп сервер в определенное время с проверкой не появился ли новый файл с измененной датой или размером.
2. Если файл новый есть, то остановить процесс powerpnt.exe
3. Скачать новый файл с заменой старого (ну или с удалением старого, как удобнее.) (Название файла всегда одно и то же)
4. Дождаться окончания закачки.
5. Запустить файл.

Примечания: Если можно, то настройки вынести в .ini файл, так как директории и диски, и названия файлов в разных филиалах могут быть разными.


Заранее благодарен.

Русское сообщество AutoIt


Оффлайн hedji [?]

  • Осваивающий
  • **
  • Сообщений: 165
  • Репутация: 26
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
По опыту лучше не вешать скрипт в бесконечный цикл с проверкой времени, а сделать запланированное задание в планировщике винды.
Презенташку на ftp не нашел, сделал на примере pdf файла.
Код: AutoIt [Выделить]
$url = IniRead(@ScriptDir & "\test.ini", "Settings", "url", "not_found") ;читаем url что качать
$old_file = IniRead(@ScriptDir & "\test.ini", "Settings", "old_file", "not_found") ;читаем где лежит старый файл
If FileExists(@ScriptDir & "\test.pdf") Then
    FileDelete(@ScriptDir & "\test.pdf")
EndIf
InetGet($url, @ScriptDir & "\test.pdf", 1, 0)
$new_file_size = FileGetSize(@ScriptDir & "\test.pdf")
$old_file_size = FileGetSize($old_file)
If $new_file_size <> $old_file_size Then
    ProcessClose("powerpnt.exe")
    FileCopy(@ScriptDir & "\test.pdf", $old_file, 1)
    Run($old_file)
EndIf
 


содержание ini-файла
[settings]
url=http://ftp.dlink.ru/pub/Router/DIR-300/Data_sh/DS_DIR-300_RUS_02.pdf
old_file=D:\Scripts\test\test_old.pdf

Оффлайн Alsagas [?]

  • Новичок
  • *
  • Сообщений: 15

  • Автор темы
  • Репутация: 0
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.x.x
Спасибо большое, но нужен заход через фтп соединение с авторизацией. Понятное дело, что зацикливать не стоит и все будет делаться через планировщик.

Оффлайн sergioz [?]

  • Новичок
  • *
  • Сообщений: 37
  • Репутация: 4
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Код: AutoIt [Выделить]
#include <Crypt.au3>
$SourceFile = IniRead(@ScriptDir & "\test.ini", "Settings", "url", "not_found") ;читаем url что качать
$DestFile = IniRead(@ScriptDir & "\test.ini", "Settings", "old_file", "not_found") ;читаем где лежит старый файл


_Ftp_Get_File($SourceFile,$DestFile&"_new");через зп вписать логин и пасс

if (_Crypt_HashFile($DestFile, $CALG_MD5) <> _Crypt_HashFile($DestFile&"_new", $CALG_MD5)) then ; если файлы разные то обновляемся
    RunWait(@ComSpec & ' /c TASKKILL /FI "IMAGENAME eq *powerpnt*" /F /T' , @SW_HIDE)
    FileDelete($DestFile)
    FileMove($DestFile&"_new",$DestFile,1)
    Run($DestFile)
EndIf


Func _Ftp_Get_File($S_File, $D_File, $user='anonymous', $pass='anonymous',$delete=False)
; Выделяем имя файла
Local $S_File_name = $S_File
Local $S_SrvName = $S_File
Local $strSwitch = True

While $strSwitch
    if StringInStr ( $S_File_name, '/' ) then
        $S_File_name = StringTrimLeft ( $S_File_name, StringInStr ( $S_File_name, '/' ) )
    Else
        $strSwitch = False
    EndIf
WEnd
; Выделяем имя файла
    if StringLeft ($S_SrvName,6) = 'ftp://' Then
        $S_SrvName = StringTrimLeft ( $S_SrvName, 6  )
        $S_File = StringTrimLeft ( $S_File , 6  )
    EndIf
    $S_SrvName = StringTrimRight ( $S_SrvName, StringLen($S_SrvName) - StringInStr ( $S_SrvName, '/' ) +1 );выделяем имя сервера
    $S_File = StringTrimLeft($S_File , StringLen($S_SrvName))
    $S_File = StringTrimRight($S_File, StringLen($S_File_name));выделяем путь ФТП
    $Open = _FTP_Open('MyFTP Control')
    $Conn = _FTP_Connect($Open, $S_SrvName, $user, $pass)
    _FTP_DirSetCurrent($Conn, $S_File)
    _FTP_FileGet ($Conn, $S_File_name, $D_File)
    if $delete then _FTP_FileDelete($Conn, $S_File_name)
    _FTP_Close($Open)

EndFunc



надо будет с путями файлов поиграться

Русское сообщество AutoIt


Оффлайн Alsagas [?]

  • Новичок
  • *
  • Сообщений: 15

  • Автор темы
  • Репутация: 0
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.x.x
выдает
Цитировать
: error: _FTP_Open(): undefined function.
Забыл еще добавить что порт на фтп не стандартный.
« Последнее редактирование: Ноябрь 24, 2017, 15:43:12 от Garrett »

Оффлайн sergioz [?]

  • Новичок
  • *
  • Сообщений: 37
  • Репутация: 4
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
выдает

: error: _FTP_Open(): undefined function.

Забыл еще добавить что порт на фтп не стандартный.

Код: AutoIt [Выделить]
#include <FTPEx.au3> ; забыл про него

в либе про настройку порта ничего не нашел
по этому используйте работу с TCP напрямую

могу рекомендовать встроенный консольный ftp.exe - к нему можно в текстовом файле  скрипты писать

cmd -> ftp /?
 -s:имя_файла    Задание текстового файла, содержащего команды FTP, которые
                 будут выполняться автоматически при запуске FTP.
« Последнее редактирование: Ноябрь 24, 2017, 15:46:44 от Garrett »

Оффлайн Alsagas [?]

  • Новичок
  • *
  • Сообщений: 15

  • Автор темы
  • Репутация: 0
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.x.x
Давайте упростим задачу, благо сейчас достаточно софта для синхронизации файлов:
Есть папка D:\Reklama\moscow.pps и тут же D:\Reklama\Temp\moscow.pps
В корне папка reklama лежит файл, который на данный момент времени запущен на компе и проигрывает ролик.
В папке reklama\Temp лежит такой же файл, но более новый, скачанный с фтп.
Нужно сравнить файл в обеих папках и, если файл в папке temp окажется более новым, то остановить процесс powerpnt.exe, переписать новый файл на место старого (То есть из папки D:\Reklama\Temp в папку D:\Reklama , и запустить этот файл.
Я думаю это будет гораздо проще.
Заранее благодарен.

Помечен как лучший ответ пользователем Alsagas Отправлен Ноябрь 30, 2017, 10:33:51

Оффлайн hedji [?]

  • Осваивающий
  • **
  • Сообщений: 165
  • Репутация: 26
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Код: AutoIt [Выделить]
$new_file_size = FileGetSize("D:\Reklama\Temp\moscow.pps")
$old_file_size = FileGetSize("D:\Reklama\moscow.pps")
If $new_file_size <> $old_file_size Then
    ProcessClose("powerpnt.exe")
    FileCopy("D:\Reklama\Temp\moscow.pps", "D:\Reklama\moscow.pps", 1)
    Run("D:\Reklama\moscow.pps")
EndIf
 


Русское сообщество AutoIt


Оффлайн Alsagas [?]

  • Новичок
  • *
  • Сообщений: 15

  • Автор темы
  • Репутация: 0
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.x.x
Спасибо. Последний вариант заработал нормально, только пришлось вместо Run использовать ShellExecute при запуске файла.

Оффлайн Alsagas [?]

  • Новичок
  • *
  • Сообщений: 15

  • Автор темы
  • Репутация: 0
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.x.x
Уважаемый hedji, а нельзя ли сюда еще и инишник прикрутить? Просто пути могут немного отличаться и мне чтобы не компилить скрипт под каждый комп отдельно, желательно бы инишку сделать. В ней особо ничего не надо, только чтобы можно было вносить пусть к старому и новому файлам.
Спасибо.

Оффлайн hedji [?]

  • Осваивающий
  • **
  • Сообщений: 165
  • Репутация: 26
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Код: AutoIt [Выделить]
$old_file = IniRead(@ScriptDir & "\test.ini", "Settings", "old_file", "not_found")
$new_file = IniRead(@ScriptDir & "\test.ini", "Settings", "new_file", "not_found")
if $old_file = "not_found" Or $new_file = "not_found" Then
    MsgBox(0, "", "Не удалось прочитать файл test.ini")
    Exit
EndIf
$new_file_size = FileGetSize($new_file)
$old_file_size = FileGetSize($old_file)
If $new_file_size <> $old_file_size Then
    ProcessClose("powerpnt.exe")
    FileCopy($new_file, $old_file, 1)
    ShellExecute($old_file)
EndIf
 


в ini-файле:
[settings]
old_file=D:\Reklama\moscow.pps
new_file=D:\Reklama\Temp\moscow.pps

Русское сообщество AutoIt


 

Похожие темы

  Тема / Автор Ответов Последний ответ
3 Ответов
2163 Просмотров
Последний ответ Сентябрь 06, 2011, 19:50:24
от Fever
7 Ответов
7825 Просмотров
Последний ответ Январь 05, 2012, 10:25:46
от zoxer1
0 Ответов
1371 Просмотров
Последний ответ Декабрь 05, 2011, 15:54:28
от Math
3 Ответов
3457 Просмотров
Последний ответ Февраль 06, 2012, 14:01:13
от pro100_bear
5 Ответов
2562 Просмотров
Последний ответ Февраль 15, 2012, 00:43:48
от Roman89
5 Ответов
2842 Просмотров
Последний ответ Июль 19, 2012, 19:43:56
от Andrei7
2 Ответов
1354 Просмотров
Последний ответ Февраль 03, 2013, 09:03:35
от madmasles
3 Ответов
1678 Просмотров
Последний ответ Май 08, 2015, 19:06:10
от madmasles
0 Ответов
629 Просмотров
Последний ответ Май 09, 2015, 08:56:04
от madmasles
1 Ответов
1672 Просмотров
Последний ответ Декабрь 21, 2015, 17:25:49
от ra4o