• Администрация SafeZone приветствует вас на нашем форуме!
    Если вы больше не желаете видеть рекламу при просмотре тем и сообщений - то достаточно просто зарегистрироваться. Для зарегистрированных пользователей реклама не отображается.

VBS диалог с пользователем

alex_diablo

Пользователь
Сообщения
132
Симпатии
9
#1
Добрый день. есть у меня батник: http://safezone.cc/threads/ne-rabotaet-skript-zapuschennyj-cherez-psexec.27808/#post-234551

батник-билдер формирует другой батник (installer.bat) и через psexec рассылается на компы пользователей и выполняется в тихом режиме (для пользователей выводится только инфа о начале и окончании работы скрипта через MSG). В целом, все устраивает, но бывает так, что пользователь не может ждать, пока будет выполняться работа скрипта (т.е. нужно или отменить или отложить его выполнение).
В связи с чем возник вопрос: можно ли сделать какое-то подобие диалога с пользователем (например на VBS, WSH, HTA или еще как-то.. я ни с чем этим дела не имел), чтобы после доставки батника на конечный комп перед началом его выполнения у пользователя появлялось окно с кнопками и возможностью выбора, например: начать установку, отложить установку (чтобы скажем, при нажатии этой кнопы диалог закрылся, но включился бы таймер и по истечении времени диалог появился бы снова) и отмена установки, при нажатии на которую все файлы, переданные на комп, были бы удалены.

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

лис.хвост

VIP
Разработчик
Сообщения
635
Симпатии
1,027
#2
Код:
nVar = MsgBox ("Начать установку?", vbInformation + vbOKCancel, "установка")
if nVar = 2 then
    WScript.Sleep 1000
end if
msgbox("end")
где 1 - выбор "ОК", 2 - "Отмена"
WScript.Sleep 1000 - засыпает на 1000 миллисекунд
 
Последнее редактирование:

alex_diablo

Пользователь
Сообщения
132
Симпатии
9
#3
VB.NET:
nVar = MsgBox ("Начать установку?", vbInformation + vbOKCancel, "установка")
if nVar = 2 then
    WScript.Sleep 1000
end if
msgbox("end")
где 1 - выбор "ОК", 2 - "Отмена"
WScript.Sleep 1000 - засыпает на 1000 миллисекунд
так а как его увязать с батником? я вообще думал типа такое сделать: при нажатии на ОК - чтобы создавался какой-нить файл например. а батник при доставке на целевой комп сразу стартует и проверяет наличие файла. если файла нет - ждет и снова проверяет, как только файл появляется - начинает установку. но наверное есть способ более правильный.. ну и кнопки ОК и отмена как-то не совсем полно решают данную проблему.. ну ОК - это начать установку... отмена - отменить. но было бы неплохо еще кнопку скажем - отложить... и вот по ее нажатию как раз и запустить таймер. скажем, на 5 мин. и через 5 мин снова показать диалог... ну и батник установочный соответственно, все это время должен ожидать действий пользователя...
 

лис.хвост

VIP
Разработчик
Сообщения
635
Симпатии
1,027
#4
Код:
nVar = MsgBox ("Начать установку?", vbInformation + vbOKCancel, "установка")
if nVar = 2 then
    WScript.Sleep 1000
end if
Set WshShell = CreateObject("WScript.Shell")
RetCode = WshShell.Run("C:\123\ВашБантик.bat", 1, True)
MsgBox "Обработка завершена! Код возврата - " & RetCode
можете в тексте сообщения написать, например:
Yes - нажмите для начала установки
No - нажмите чтобы отменить установку
Cancel - нажмите чтобы отложить установку

и соответственно кнопки поменять на vbYesNoCancel (константы для диалоговых окон можно посмотреть тут)
 
Последнее редактирование:

alex_diablo

Пользователь
Сообщения
132
Симпатии
9
#5
ок, поменял на: vbYesNoCancel

теперь 3 кнопки: да, нет и отмена.

но, если по нажатию ДА стартует скрипт, то по нажатию НЕТ также стартует скрипт. а по нажатию НЕТ как раз и должен отсчитываться таймер, к примеру 60000 мсек.
после окончания работы таймера должно снова появиться это же диалоговое окно с выбором.
а при нажатии ОТМЕНА окно просто должно закрыться и скрипт выполняться не должен... ну и желательно прибить сам файл скрипта и батник..
не могу понять, где это все прописывается и каким образом...
 

лис.хвост

VIP
Разработчик
Сообщения
635
Симпатии
1,027
#6
так оформите все в процедуры и по условиям смотрите
PS: неплохо было бы код приложить или хотя бы кусок с проверкой кода возврата окна
 

alex_diablo

Пользователь
Сообщения
132
Симпатии
9
#7
как я уже сказал - с vbs скриптами я дело имею в первый раз и вообще не программер я ни разу... но делать кой-какие вещи иногда приходится( поэтому очевидные для вас вещи, такие как процедуры для меня вовсе не так очевидны((
 

alex_diablo

Пользователь
Сообщения
132
Симпатии
9
#11
наверное мы не поняли друг друга... я пока что ничего не запускаю. я пока что думаю, как увязать батник и скрипт вбс. в первом посте есть сцыль на тему, где выложен фрагмент кода батника-билдера, который формирует батник-инсталлер, который в свою очередь через psexec (в батнике-билдере код отправки на целевые машины указан) доставляется на целевую машину. на данном этапе он сразу стартует и выполняется. а мне нужно, чтобы перед его стартом запускался скрипт диалога с пользователем, т.е. полагаю, что сначала там должен идти вызов запуска vbs скрипта.. но я хз как это сделать, ведь батник запускается под другой учеткой. либо может дополнительно отправлять скрипт диалога в интерактивном режиме psexec ... просто не хотелось бы, чтобы какие-либо окна CMD отображались для конечного пользователя... только VBS. не знаю, можно ли так реализовать. посему я и спрашиваю совета:

1 - как реализовать доставку на целевую машину
2 - как увязать вбс скрипт с батником
 

лис.хвост

VIP
Разработчик
Сообщения
635
Симпатии
1,027
#12
для запуска батника
Код:
sub install
    nVar = MsgBox ("Начать установку?", vbInformation + vbYesNoCancel, "установка")
    '6 - yes
    '7 - no
    '2 - cancel
    select case nVar
        case 6
            call start
        case 7
            WScript.Sleep 60000
            call install
        case 2
            exit sub
    end select
end sub

sub start
    Set WshShell = CreateObject("WScript.Shell")
    RetCode = WshShell.Run("C:\123\ВашБантик.bat", 1, True)
    MsgBox "Обработка завершена! Код возврата - " & RetCode
end sub

call install
кстати, если заменить на строчку
Код:
RetCode = WshShell.Run("C:\123\ВашБантик.bat", 0, True)
то черный экран мелькать не будет у пользователя
 

alex_diablo

Пользователь
Сообщения
132
Симпатии
9
#13
да! работает, спасибо
только вторая проблема осталась... как из батника вызвать этот скрипт?
ведь командой psexec батник передается на комп и стартует там...
а надо, чтобы его выполнение начиналось после ответа пользователя...
возможно ли вызвать скрипт этот из батника?
чтобы впоследствии, он ожидал действия пользоваля?

попробую детальнее пояснить по пунктам:

допустим, файл скрипта 1.vbs лежит в сетевой шаре, тогда:
1. копируем батник-инсталлер на целевую машину:
CMD/BATCH:
psexec -s -h -d \\domain_comp -c -f installer.bat
2. далее батник стартует, содержимое батника:

CMD/BATCH:
xcopy /Y \\fsmsk1\Soft\scripts\1.vbs c:\temp\1.vbs
start /wait c:\temp\1.vbs

:: далее нужно как-то написать код ожидания ответа от пользователя
:: из скрипта и в зависимости от нажатой там кнопки далее уже действие:
:: либо код батника этого выполняется дальше, либо ожидаем минуту, если
:: юзер нажал НЕТ, либо если нажал ОТМЕНА - завершаем работу батника,
:: и удаляем все файлы: файл скрипта, который скопировали с сетевой шары
:: и этот батник
и все бы хорошо, но:

1. т.к. батник у нас запускается в скрытом режиме, как из него запустить скрипт 1.vbs в интерактивном режите, чтобы пользователь его видел?
вариант psexec -i -s -h -d \\domain_comp -c -f installer.bat не подходит, т.к. тогда будет отображаться и окно самого батника, что не нужно...

ну и второе - как от кнопок передать действия внутрь батника? чтобы в зависимости от нажатой кнопки выполнялось дальнейшее действие...
либо выполняем батник по пунктам, либо ждем и снова предлагаем пользователю выбрать действие, либо отменяем установку и подчищаем за собой файлы...
 

Dragokas

Very kind Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
5,507
Симпатии
5,337
#14
Написал в виде функции. Запустите демку:

CMD/BATCH:
@echo off
SetLocal EnableExtensions

call :msgbox_Init

call :msgbox "Msg=Сообщение" "Заголовок" %vbYesNo% ret
call :msgbox "Msg=Сообщение в \n несколько \n строк" "Заголовок" %vbYesNo% ret

:: обработка результата нажатия
if "%ret%"=="%vbYes%" echo Yes
if "%ret%"=="%vbNo%" echo No

pause >nul
goto :eof

:msgbox_Init
  :: Константы кнопок: https://msdn.microsoft.com/en-us/library/office/gg264626.aspx)
  set vbYesNo=4
  set vbYes=6
  set vbNo=7
exit /B
:msgbox [_in_Message] [_in_Title] [_in_Button_const] [_out_variable]
  :: результат в виде кода нажатой клавиши возвращается в переменную, указанную в аргументе № 4
  set "Msg=%~1"
  set "%Msg:\n=""&vblf&""%"
  for /f "UseBackQ delims=" %%i in (`mshta vbscript:Execute("CreateObject(""Scripting.FileSystemObject"").GetStandardStream(1).Write(MsgBox(""%Msg%"",%~3,""%~2""))&Close()"^)`) do set "%~4=%%~i"
exit /B
 
Последнее редактирование:

alex_diablo

Пользователь
Сообщения
132
Симпатии
9
#15
Написал в виде функции. Запустите демку:
]
что-то как то криво запускается... а если запускать через psexec с параметрами -i -d на удаленной машине, то вообще окошко не отображается, более того, все вешается почему-то...

а можно в данном коде:

для запуска батника
Код:
sub install
    nVar = MsgBox ("Начать установку?", vbInformation + vbYesNoCancel, "установка")
    '6 - yes
    '7 - no
    '2 - cancel
    select case nVar
        case 6
            call start
        case 7
            WScript.Sleep 60000
            call install
        case 2
            exit sub
    end select
end sub

sub start
    Set WshShell = CreateObject("WScript.Shell")
    RetCode = WshShell.Run("C:\123\ВашБантик.bat", 1, True)
    MsgBox "Обработка завершена! Код возврата - " & RetCode
end sub

call install
на кнопку ДА вместо запуска батника назначить создание обычного текстового файла?
например жмем кнопку ДА и создается файл: c:\windows\temp\file1.txt
кнопка НЕТ также отсчитывает время и снова выдает диалог;
а если нажать кнопку ОТМЕНА, чтобы создавался файл: c:\windows\temp\file2.txt

хочу кое-что попробовать...
 
Последнее редактирование:

лис.хвост

VIP
Разработчик
Сообщения
635
Симпатии
1,027
#16
конечно можно, в процедуре start замените код на
Код:
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set textFile = objFSO.OpenTextFile("c:\windows\temp\file1.txt", 8, True)
textFile.WriteLine "сюда, кстати, можно записать содержимое батника и запустить его"
textFile.Close
 

alex_diablo

Пользователь
Сообщения
132
Симпатии
9
#17
я правильно же написал для кнопки ОТМЕНА код?

VB.NET:
sub install
    nVar = MsgBox ("Начать установку?", vbInformation + vbYesNoCancel, "установка")
    '6 - yes
    '7 - no
    '2 - cancel
    select case nVar
        case 6
            call start
        case 7
            WScript.Sleep 10000
            call install
        case 2
            call cancel
    end select
end sub

sub start
    Set objFSO = CreateObject("Scripting.FileSystemObject")
Set textFile = objFSO.OpenTextFile("c:\windows\temp\file1.txt", 8, True)
textFile.WriteLine "сюда, кстати, можно записать содержимое батника и запустить его"
textFile.Close
end sub
sub cancel
    Set objFSO = CreateObject("Scripting.FileSystemObject")
Set textFile = objFSO.OpenTextFile("c:\windows\temp\file2.txt", 8, True)
textFile.WriteLine "сюда, кстати, можно записать содержимое батника и запустить его"
textFile.Close
end sub

call install
и еще... для кнопок можно задавать произвольные надписи? или только ДА, НЕТ, ОТМЕНА?