Войти

Показать полную графическую версию : вывести сообщение и закрыть его


Copter
22-03-2012, 12:06
Добрый день.
Необходимо создать 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" и приступайте к работе... "

Кто может помочь, просьба привести скрипт целиком. Потому как в скриптах не особо шарю )))

Iska
23-03-2012, 02:02
В чём смысл попытки одновременного использования параметров «/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», и завершать его, при необходимости — Вы не планировали?

Copter
23-03-2012, 09:31
Проверять, запущено ли в этот момент само приложение не требуется, т.к. обновление начинается при входе в систему, но юзер может запустить программу в процессе обновления, и как результат часть файлов заблокируются. Поэтому описанные 3 пункта являются наиболее оптимальным решением для защиты от действий нетерпеливого пользователя.
В любом случае спасибо за предложение, но задача стоит именно так.

Отдельное спасибо за код, но опять же интересует именно bat файл(команды CMD+ява там, где иначе никак), потому как параметры обновления будут постоянно меняться (замена файлов по дате, дописать новые или заменить только отдельные каталоги и т.д.).
Батник используется как сценарий входа в винду пользователей домена. Нужно иметь возможность быстро поправить в зависимости от ситуации код не имея особых навыков программирования(печально но факт). Команды CMD достаточно просты в использовании, а куски явы (для вывода сообщений и их закрытия) можно использовать без особого понимания происходящих процессов, правя лишь выводимый текст.
Посему, основная задача сводится к 2м кускам ява кода, один из которых выведет окошко с нужным сообщением, а другой его просто закроет.

Iska
23-03-2012, 23:10
1. Речь идёт явно не о Java, а о JavaScript как одного из движков, входящих в состав WSH, а это принципиально разные технологии.

2. JavaScript никак не поможет Вам сделать это:
причем БЕЗ кнопки "OK" »
— в WSH отсутствуют какие-либо встроенные средства для этого. Потребуется, как минимум, использование промежуточного HTA.

3. Без блокирования ввода ничто не помещает пользователю запустить в момент обновления обновляемое приложение, что может привести к невозможности замены заблокированных файлов. И описанные Вами выше три пункта никак не могут помешать ему сделать это.

параметры обновления будут постоянно меняться (замена файлов по дате, дописать новые или заменить только отдельные каталоги и т.д.). »
Я вижу один приемлемый вариант — использование WiX, создание и использование msi/msp посредством групповой политики. Тогда уж точно не будет проблем, и не потребуется извращаться, как уберечься от пользователя.

Кстати, а почему обновление Вы делаете в сеансе пользователя, а не при загрузке машины (проще говоря — почему в контексте User, а не Computer)?

zion87
24-03-2012, 08:50
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

Copter
27-03-2012, 09:46
Iska, По поводу 1 пункта я с Вами полностью согласен, серьёзная неточность.
Со вторым видимо придётся смириться.
По поводу же третьего пункта спорно. Юзеры конечно могут запустить прогу, но все-таки когда видишь сообщение типа "руки проч от клавы пока не разрешу!!!" здравый смысл должен победить... наверное...
А вот что касается вопроса "почему User, а не Computer?", то ответ заключается в том что в домене порядка сотни компов. "Програмкой" пользуются около 30-ти. Но проблема в том что народ не сидит на своих местах а бегает с компа на комп(дурдом , но тут против руководства не попрешь).Отлавливать кто куда сегодня сел и менять параметры Груповой политики как-то не серьёзно. А нагружать сервак копированием на сотню компов сразу черевато - заходят с утра все почти одновременно и как результат копирование может длиться до 20-30 минут(проверено).


А вообще мне очень понравилась идея zion87 (за что ему огромное спасибо) блокировать в реестре запуск проги.
В этом случае достаточно 1 раз объяснить юзерам,что если при запуске проги с утра выходит сообщение:

http://s19.radikal.ru/i192/1203/6c/ccbcf8466e19.jpg

то надо подождать до появление окошка "Обновление закончено... нажмите "OK" и приступайте к работе... ". При этом они могут спокойно заниматься другими делами (благо других рабочих прог у них хватает).

Относительно WiX, идея хорошая но надо разбираться а хотелось решить вопрос максимально просто )

Ответ на главный свой вопрос "как закрыть выведенное ранее сообщение, средствами JavaScript" я получил - НИКАК.
Зато теперь появились иные решения самой задачи обновления. Но это уже другая история.
Всем большое спасибо, думаю тему можно закрывать.

Iska
27-03-2012, 10:05
А нагружать сервак копированием на сотню компов сразу черевато - заходят с утра все почти одновременно и как результат копирование может длиться до 20-30 минут(проверено). »
Это судьба: Вам дорога в msi.

А вообще мне очень понравилась идея zion87 (за что ему огромное спасибо) блокировать в реестре запуск проги. »
Идея хорошая. Но правильнее будет, как я уже писал выше, обновлять до загрузки сеанса пользователя.




© OSzone.net 2001-2012