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

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - вывести сообщение и закрыть его

Ответить
Настройки темы
CMD/BAT - вывести сообщение и закрыть его

Новый участник


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

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


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

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

Отправлено: 12:06, 22-03-2012

 

Ветеран


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

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


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

Отправлено: 02:02, 23-03-2012 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Новый участник


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

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


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

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

Последний раз редактировалось Copter, 23-03-2012 в 10:42.


Отправлено: 09:31, 23-03-2012 | #3


Ветеран


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

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


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

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

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

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

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

Отправлено: 23:10, 23-03-2012 | #4


Аватара для zion87

Старожил


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

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


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

Последний раз редактировалось zion87, 25-03-2012 в 09:48.

Это сообщение посчитали полезным следующие участники:

Отправлено: 08:50, 24-03-2012 | #5


Новый участник


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

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


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


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



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

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

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

Отправлено: 09:46, 27-03-2012 | #6


Ветеран


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

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


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

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

Отправлено: 10:05, 27-03-2012 | #7



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - вывести сообщение и закрыть его

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
При обновлении стрницы php появляется сообщение как его убрать? Ferum01 Вебмастеру 1 29-11-2010 17:41
[решено] Как вывести сообщение во время выолнения команды? Centrinar AutoIt 6 11-02-2010 00:40
[решено] как выдать сообщение не остонавливая скрипт до закрытия его пользователем? andr_mozg AutoIt 10 09-01-2010 23:42
CMD/BAT - [решено] вывести сообщение на экран если файл весит больше 1 гига mars Скриптовые языки администрирования Windows 2 14-12-2009 11:03
Как вывести сообщение после входа в учетную запись, а не при загрузке Windows? Unique_User Microsoft Windows 2000/XP 7 21-03-2007 12:51




 
Переход