Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   вывести сообщение и закрыть его (http://forum.oszone.net/showthread.php?t=230988)

Copter 22-03-2012 12:06 1884531

вывести сообщение и закрыть его
 
Добрый день.
Необходимо создать 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 1885071

В чём смысл попытки одновременного использования параметров «/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 1885151

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

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

Iska 23-03-2012 23:10 1885554

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

2. JavaScript никак не поможет Вам сделать это:
Цитата:

Цитата Copter
причем БЕЗ кнопки "OK" »

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

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

Цитата:

Цитата Copter
параметры обновления будут постоянно меняться (замена файлов по дате, дописать новые или заменить только отдельные каталоги и т.д.). »

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

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

zion87 24-03-2012 08:50 1885660

Copter, могу предложить такой вариант, перед началом копирования запускается файлик exe вот что он выводит

а после завершения копирования просто 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

должно получиться что то вроде этого

после обновления...
Код:

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 1887552

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


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



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

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

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

Iska 27-03-2012 10:05 1887572

Цитата:

Цитата Copter
А нагружать сервак копированием на сотню компов сразу черевато - заходят с утра все почти одновременно и как результат копирование может длиться до 20-30 минут(проверено). »

Это судьба: Вам дорога в msi.

Цитата:

Цитата Copter
А вообще мне очень понравилась идея zion87 (за что ему огромное спасибо) блокировать в реестре запуск проги. »

Идея хорошая. Но правильнее будет, как я уже писал выше, обновлять до загрузки сеанса пользователя.


Время: 18:42.

Время: 18:42.
© OSzone.net 2001-