Показать полную графическую версию : вывести сообщение и закрыть его
Добрый день.
Необходимо создать bat файл для обновления программы programka путем простого копирования с заменой.
Как бы вроде достаточно:
@echo var WSHShell = WScript.CreateObject("WScript.Shell"); > %temp%\mes.js
echo WSHShell.Popup("Внимание!Обновляется Programka, просьба убрать руки от клавиатуры и дождаться окончания копирования"); >> %temp%\mes.js
start %temp%\mes.js
deltree /y %temp%\mes.js
@xcopy \\server\programka\*.* "c:\Program Files\programka\" /s /e /y
НО, хочется чтобы Bat файл работал следующим образом:
1. Юзеру выводится сообщение о начале обновления "Внимание!Обновляется Programka....", причем БЕЗ кнопки "OK"
2. Происходит непосредственно само копирование (ну тут обычного xcopy хватит)
3. По окончании копирования,автоматически закрывается окно "Внимание!Обновляется Programka...." и выводится новое "Обновление закончено... нажмите "OK" и приступайте к работе... "
Кто может помочь, просьба привести скрипт целиком. Потому как в скриптах не особо шарю )))
В чём смысл попытки одновременного использования параметров «/s» и «/e»?
Copter, Вам, пожалуй, подойдёт код на AutoIt:
AutoItSetOption("MustDeclareVars", 1)
Local $sSourceFolder = "\\server\programka"
Local $sDestFolder = "c:\Program Files\programka"
; Local $sSourceFolder = "E:\Песочница\0131\Source"
; Local $sDestFolder = "E:\Песочница\0131\Dest"
Local $bErrorCode = 0
OnAutoItExitRegister("OnExit")
BlockInput(1)
If FileExists($sSourceFolder) Then
SplashTextOn("Обновление приложения «Programka»", "Идёт процесс обновления приложения «Programka»…", 480, 36, -1, -1, -1, "", 8)
If DirCopy($sSourceFolder, $sDestFolder, 1) = 1 Then
SplashTextOn("Обновление приложения «Programka»", "Обновление приложения «Programka» завершено.", 480, 36, -1, -1, -1, "", 8)
Sleep(2000)
Else
ConsoleWriteError("There is an error while copying the source folder [" & $sSourceFolder & "] in destination folder [" & $sDestFolder & "]" & @CRLF)
$bErrorCode = 2
EndIf
SplashOff()
Else
ConsoleWriteError("Can't find source folder [" & $sSourceFolder & "]" & @CRLF)
$bErrorCode = 1
EndIf
Exit($bErrorCode)
Func OnExit()
BlockInput(0)
EndFunc
Проверять, запущено ли в этот момент само приложение «Programka», и завершать его, при необходимости — Вы не планировали?
Проверять, запущено ли в этот момент само приложение не требуется, т.к. обновление начинается при входе в систему, но юзер может запустить программу в процессе обновления, и как результат часть файлов заблокируются. Поэтому описанные 3 пункта являются наиболее оптимальным решением для защиты от действий нетерпеливого пользователя.
В любом случае спасибо за предложение, но задача стоит именно так.
Отдельное спасибо за код, но опять же интересует именно bat файл(команды CMD+ява там, где иначе никак), потому как параметры обновления будут постоянно меняться (замена файлов по дате, дописать новые или заменить только отдельные каталоги и т.д.).
Батник используется как сценарий входа в винду пользователей домена. Нужно иметь возможность быстро поправить в зависимости от ситуации код не имея особых навыков программирования(печально но факт). Команды CMD достаточно просты в использовании, а куски явы (для вывода сообщений и их закрытия) можно использовать без особого понимания происходящих процессов, правя лишь выводимый текст.
Посему, основная задача сводится к 2м кускам ява кода, один из которых выведет окошко с нужным сообщением, а другой его просто закроет.
1. Речь идёт явно не о Java, а о JavaScript как одного из движков, входящих в состав WSH, а это принципиально разные технологии.
2. JavaScript никак не поможет Вам сделать это:
причем БЕЗ кнопки "OK" »
— в WSH отсутствуют какие-либо встроенные средства для этого. Потребуется, как минимум, использование промежуточного HTA.
3. Без блокирования ввода ничто не помещает пользователю запустить в момент обновления обновляемое приложение, что может привести к невозможности замены заблокированных файлов. И описанные Вами выше три пункта никак не могут помешать ему сделать это.
параметры обновления будут постоянно меняться (замена файлов по дате, дописать новые или заменить только отдельные каталоги и т.д.). »
Я вижу один приемлемый вариант — использование WiX, создание и использование msi/msp посредством групповой политики. Тогда уж точно не будет проблем, и не потребуется извращаться, как уберечься от пользователя.
Кстати, а почему обновление Вы делаете в сеансе пользователя, а не при загрузке машины (проще говоря — почему в контексте User, а не Computer)?
Copter, могу предложить такой вариант, перед началом копирования запускается файлик exe вот что он выводит
http://i060.radikal.ru/1203/27/79f1ac94ccc6.jpg
а после завершения копирования просто taskill-ом убиваешь данный процесс и сообщение пропадает ну а про сообщение "нажмите ок" с этим и js справиться....
примерно так:
@echo off
start c:\mess.exe
@xcopy \\server\programka\*.* "c:\Program Files\programka\" /s /e /y
taskkill /f /im mess.exe
@echo var WSHShell = WScript.CreateObject("WScript.Shell"); > %temp%\mes.js
echo WSHShell.Popup("Обновление закончено... нажмите "OK" и приступайте к работе..."); >> %temp%\mes.js
start /w %temp%\mes.js
deltree /y %temp%\mes.js
exit
прочитал тему повнимательнее и нашел еще один пунктик - запрет запуска программы на то время пока проходит обновление и вот что могу предложить:
до запуска обновления...
reg add "HKCU\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer" /v DisallowRun /t REG_DWORD /d 1 /f
reg add "HKCU\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer\DisallowRun" /v 1 /t REG_SZ /d Programka.exe /f
должно получиться что то вроде этого
http://s19.radikal.ru/i192/1203/6c/ccbcf8466e19.jpg
после обновления...
reg delete "HKCU\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer\DisallowRun" /f
reg delete "HKCU\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer" /v DisallowRun /f
Iska, По поводу 1 пункта я с Вами полностью согласен, серьёзная неточность.
Со вторым видимо придётся смириться.
По поводу же третьего пункта спорно. Юзеры конечно могут запустить прогу, но все-таки когда видишь сообщение типа "руки проч от клавы пока не разрешу!!!" здравый смысл должен победить... наверное...
А вот что касается вопроса "почему User, а не Computer?", то ответ заключается в том что в домене порядка сотни компов. "Програмкой" пользуются около 30-ти. Но проблема в том что народ не сидит на своих местах а бегает с компа на комп(дурдом , но тут против руководства не попрешь).Отлавливать кто куда сегодня сел и менять параметры Груповой политики как-то не серьёзно. А нагружать сервак копированием на сотню компов сразу черевато - заходят с утра все почти одновременно и как результат копирование может длиться до 20-30 минут(проверено).
А вообще мне очень понравилась идея zion87 (за что ему огромное спасибо) блокировать в реестре запуск проги.
В этом случае достаточно 1 раз объяснить юзерам,что если при запуске проги с утра выходит сообщение:
http://s19.radikal.ru/i192/1203/6c/ccbcf8466e19.jpg
то надо подождать до появление окошка "Обновление закончено... нажмите "OK" и приступайте к работе... ". При этом они могут спокойно заниматься другими делами (благо других рабочих прог у них хватает).
Относительно WiX, идея хорошая но надо разбираться а хотелось решить вопрос максимально просто )
Ответ на главный свой вопрос "как закрыть выведенное ранее сообщение, средствами JavaScript" я получил - НИКАК.
Зато теперь появились иные решения самой задачи обновления. Но это уже другая история.
Всем большое спасибо, думаю тему можно закрывать.
А нагружать сервак копированием на сотню компов сразу черевато - заходят с утра все почти одновременно и как результат копирование может длиться до 20-30 минут(проверено). »
Это судьба: Вам дорога в msi.
А вообще мне очень понравилась идея zion87 (за что ему огромное спасибо) блокировать в реестре запуск проги. »
Идея хорошая. Но правильнее будет, как я уже писал выше, обновлять до загрузки сеанса пользователя.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.