Имя пользователя:
Пароль:
 

Показать сообщение отдельно

Ветеран


Contributor


Сообщения: 2735
Благодарности: 1699

Профиль | Отправить PM | Цитировать


Lorttt,
Вот решение, способное автоматизировать процесс в рамках Вашей постановки задачи, пропишите свои пути на машине клиента
Код: Выделить весь код
DirSoft = "Z:\loc\tra la la\Factory"        'Папка с софтом на локальной машине
DirUpd = "\\192.168.1.11\www\Factory"       'Папка с обновлениями на сервере

DirArc = DirSoft + "\Box_Arc"               ' Папка с архивными копиями
NDayCopy = 7                                ' Сколько дней храним копии

ErrTime = 60                                ' Время (сек) отображения сообщения об ошибке перед завершением скрипта

Browser = "C:\Program Files\Internet Explorer\iexplore.exe"     ' Екзешник эксплорера
ParamStart = "https://gomel.today/"                             ' Параметр запуска эксплорера с задачей

NCancel = 1                     ' Число напоминаний о завершении браузера. Затем он будет убит принудительно
TCancel = 120                     ' Время (сек) ожидания реакции на запрос

Set FSO = CreateObject("Scripting.FileSystemObject")
Set WShell = CreateObject("WScript.Shell")

On Error Resume Next        ' ==========

Set FDirSoft = FSO.GetFolder(DirSoft)

If Err.Number <> 0 Then
    LL = WShell.Popup(DirSoft + vbCrLf + vbCrLf + "Код ошибки " + CStr(Err.Number) + vbCrLf + Err.Description, ErrTime, "Ошибка открытия папки", 16)
    WScript.Quit
End If

Set FDirUpd = FSO.GetFolder(DirUpd)
    
If Err.Number <> 0 Then
    LL = WShell.Popup(DirUpd + vbCrLf + vbCrLf + "Код ошибки " + CStr(Err.Number) + vbCrLf + Err.Description, ErrTime, "Ошибка открытия папки", 16)
    WScript.Quit
End If
    
Set FilesSoft = FDirSoft.Files
Set FilesUpd = FDirUpd.Files

If FilesUpd.Count = 0 Then WScript.Quit

For Each FileNew In FilesUpd
    NameUpd = FileNew.Name
    MakeDir = True
 
    For Each FileOld In FilesSoft
        NameSoft = FileOld.Name
        If NameUpd = NameSoft Then
            MakeDir = (FileOld.DateLastModified <> FileNew.DateLastModified)
            If MakeDir Then Exit For
        End If
    Next
    If MakeDir Then Exit For
Next
On Error GoTo 0


If MakeDir Then
    Call Term(Browser, NCancel, TCancel)
 
On Error Resume Next        ' ==========
' Делаю папку для архива
    If Not FSO.FolderExists(DirArc) Then FSO.CreateFolder (DirArc)
    DirArcN = Now()
    DirArcN = DirArc + "\" + CStr(Year(DirArcN) * 10000 + Month(DirArcN) * 100 + Day(DirArcN)) + "_" + Mid(CStr(1000000 + Hour(DirArcN) * 10000 + Minute(DirArcN) * 100 + Second(DirArcN)), 2, 6)
    FSO.CreateFolder (DirArcN)
    
' Перемещаю имеющееся в архив
    If FilesSoft.Count > 0 Then
        LL = FSO.MoveFile(DirSoft + "\*.*", DirArcN)
        If Err.Number <> 0 Then
            LL = WShell.Popup("Обратитесь в техподдержку" + vbCrLf + vbCrLf + DirArcN + vbCrLf + "Код ошибки " + CStr(Err.Number) + vbCrLf + Err.Description, ErrTime, "Не создана копия задачи", 16)
            WScript.Quit
        End If
    End If

' Копирую обновления
    LL = FSO.CopyFolder(DirUpd, DirSoft)
    If Err.Number <> 0 Then
        LL = WShell.Popup("Обратитесь в техподдержку" + vbCrLf + vbCrLf + DirSoft + vbCrLf + "Код ошибки " + CStr(Err.Number) + vbCrLf + Err.Description, ErrTime, "Обновление не проделано", 16)
        WScript.Quit
    End If
    
 ' Удалю очень старые копии
    Set FDirArc = FSO.GetFolder(DirArc)
    Set FoldArc = FDirArc.SubFolders
    For Each Fold In FoldArc
        If DateDiff("d", Fold.DateCreated, Now()) > NDayCopy Then
            FSO.DeleteFolder (DirArc + "\" + Fold.Name)
        End If
    Next
    WShell.Run """" + Browser + """ " + ParamStart, 1, False
    
    On Error GoTo 0
    
End If

Sub Term(Browser, NCancel, TCancel)
    Set FSO = CreateObject("Scripting.FileSystemObject")
    Set WShell = CreateObject("WScript.Shell")
    
    MsgTxt = ""
    MsgTxt = MsgTxt + "Программное обеспечение нуждается в обновлении." + vbCrLf
    MsgTxt = MsgTxt + "Закройте все окна с браузером. Нажмите ""OK""" + vbCrLf + vbCrLf
    MsgTxt = MsgTxt + "В противном случае программное обеспечение" + vbCrLf
    MsgTxt = MsgTxt + "будет завершено принудительно" + vbCrLf
    MsgTxt = MsgTxt + "с риском потери результатов Вашей работы" + vbCrLf
    
    For i = 1 To NCancel
        LL = WShell.Popup(MsgTxt, TCancel, "Внимание! ПО должно обновиться", 49)
        If LL = 2 Then WScript.Quit
    Next

    Proc = FSO.GetFileName(Browser)
    Set WMI = GetObject("winMgmts:")
    SQuery = "Select *From Win32_Process Where Name=" + """" + Proc + """"

    Set Processes = WMI.ExecQuery(SQuery)
    If Processes.Count = 0 Then Exit Sub

        On Error Resume Next
        For Each Process In Processes
            Process.Terminate
        Next
        On Error GoTo 0

End Sub
Тестируйте, ибо в любой программе существует хотя бы одна ошибка
Как это работает:
Сохраните скрипт в файл с расширением .vbs на клиентской машине в кодировке Windows 1251.
1. При запуске скрипта на клиентской машине вручную:
1.1. Сравниваются файлы на сервере и на клиентской машине. Если все даты изменения файлов на сервере и у клиента совпадают и все файлы у клиента присутствуют, то не делаем ничего.
1.2. В противном случае:
1.2.1. Если у клиента запущен браузер, из-под которого работает задача, выдаётся запрос о том, что его работу надо завершить.
Пользователю даётся на это время. Если пользователь не реагирует, браузер завершится принудительно. Точнее, закроются все окна и все экземпляры браузера, даже если он используется для других целей.
У пользователя остаётся возможность отказаться от обновления в отведённое на реагирование время.
1.2.2. При отсутствии запущенного браузера все файлы задачи перемещаются в архивную папку. Я бы предложил, например, такую иерархию:
Z:\loc\tra la la\Factory\Box_Arc\20170619_115818
Z:\loc\tra la la\Factory\Box_Arc\20170619_164201
В любом случае, считаю необходимым иметь отдельную выделенную папку для архивов. Не обязательно в Factory.
1.2.3. Копируются все файлы с сервера в папку задачи.
1.2.4. Просматривается архивная папка. Папки-архивы старше указанного количества дней, удаляются. Именно поэтому требуется для папок-архивов отдельная папка, чтобы не удалить лишнего. А если их не удалять, то получим в конце концов их громадное количество.
1.2.5. Запускается браузер. В параметре адрес задачи. Пропишите правильный.
2. Вариант, который оставит Вас без работы и грозит увольнением
(Вы целый день этим вручную занимаетесь, теперь это будет делаться без Вас ).
Поставьте этот скрипт в запланированные задания в планировщике у клиента, чтобы он работал ежедневно несколько раз в день. Он сработает точно так же, как вручную. Единственное, зачем Вы нужны, выложить обновление на сервер. При отсутствии обновления пользователь работу скрипта не заметит. При обновлении пользователь в состоянии адекватно ответить.

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.


Последний раз редактировалось megaloman, 19-06-2017 в 19:18.


Отправлено: 18:56, 19-06-2017 | #20