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

Тема в разделе "Visual Basic 6 / Сценарии VBScript, JScript", создана пользователем alex_diablo, 22 сен 2016.

Метки:
  1. alex_diablo
    Оффлайн

    alex_diablo Пользователь

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

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

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

    лис.хвост VIP Разработчик

    Сообщения:
    630
    Симпатии:
    983
    Код (Text):
    nVar = MsgBox ("Начать установку?", vbInformation + vbOKCancel, "установка")
    if nVar = 2 then
        WScript.Sleep 1000
    end if
    msgbox("end")
    где 1 - выбор "ОК", 2 - "Отмена"
    WScript.Sleep 1000 - засыпает на 1000 миллисекунд
     
    Последнее редактирование: 22 сен 2016
    Kиpилл и akok нравится это.
  3. alex_diablo
    Оффлайн

    alex_diablo Пользователь

    Сообщения:
    104
    Симпатии:
    7
    так а как его увязать с батником? я вообще думал типа такое сделать: при нажатии на ОК - чтобы создавался какой-нить файл например. а батник при доставке на целевой комп сразу стартует и проверяет наличие файла. если файла нет - ждет и снова проверяет, как только файл появляется - начинает установку. но наверное есть способ более правильный.. ну и кнопки ОК и отмена как-то не совсем полно решают данную проблему.. ну ОК - это начать установку... отмена - отменить. но было бы неплохо еще кнопку скажем - отложить... и вот по ее нажатию как раз и запустить таймер. скажем, на 5 мин. и через 5 мин снова показать диалог... ну и батник установочный соответственно, все это время должен ожидать действий пользователя...
     
  4. лис.хвост
    Оффлайн

    лис.хвост VIP Разработчик

    Сообщения:
    630
    Симпатии:
    983
    Код (Text):
    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
    --- Объединённое сообщение, 22 сен 2016 ---
    можете в тексте сообщения написать, например:
    Yes - нажмите для начала установки
    No - нажмите чтобы отменить установку
    Cancel - нажмите чтобы отложить установку

    и соответственно кнопки поменять на vbYesNoCancel (константы для диалоговых окон можно посмотреть тут)
     
    Последнее редактирование: 22 сен 2016
    akok нравится это.
  5. alex_diablo
    Оффлайн

    alex_diablo Пользователь

    Сообщения:
    104
    Симпатии:
    7
    ок, поменял на: vbYesNoCancel

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

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

    лис.хвост VIP Разработчик

    Сообщения:
    630
    Симпатии:
    983
    так оформите все в процедуры и по условиям смотрите
    PS: неплохо было бы код приложить или хотя бы кусок с проверкой кода возврата окна
     
  7. alex_diablo
    Оффлайн

    alex_diablo Пользователь

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

    лис.хвост VIP Разработчик

    Сообщения:
    630
    Симпатии:
    983
    alex_diablo, не грустите, просто покажите код)
     
  9. alex_diablo
    Оффлайн

    alex_diablo Пользователь

    Сообщения:
    104
    Симпатии:
    7
    так какой код то показать?)
     
  10. лис.хвост
    Оффлайн

    лис.хвост VIP Разработчик

    Сообщения:
    630
    Симпатии:
    983
    то что Вы запускаете чтобы сообщение вышло
     
  11. alex_diablo
    Оффлайн

    alex_diablo Пользователь

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

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

    лис.хвост VIP Разработчик

    Сообщения:
    630
    Симпатии:
    983
    для запуска батника
    Код (Text):
    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
    --- Объединённое сообщение, 22 сен 2016 ---
    кстати, если заменить на строчку
    Код (Text):
    RetCode = WshShell.Run("C:\123\ВашБантик.bat", 0, True)
    то черный экран мелькать не будет у пользователя
     
    Kиpилл нравится это.
  13. alex_diablo
    Оффлайн

    alex_diablo Пользователь

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

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

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

    Код (DOS):
    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 не подходит, т.к. тогда будет отображаться и окно самого батника, что не нужно...

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

    Dragokas Very kind Developer Команда форума Супер-Модератор Разработчик Клуб переводчиков

    Сообщения:
    4.492
    Симпатии:
    4.307
    Написал в виде функции. Запустите демку:

    Код (DOS):
    @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
     
     
    Последнее редактирование: 22 сен 2016
    Kиpилл нравится это.
  15. alex_diablo
    Оффлайн

    alex_diablo Пользователь

    Сообщения:
    104
    Симпатии:
    7
    что-то как то криво запускается... а если запускать через psexec с параметрами -i -d на удаленной машине, то вообще окошко не отображается, более того, все вешается почему-то...

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

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

    хочу кое-что попробовать...
     
    Последнее редактирование: 23 сен 2016
  16. лис.хвост
    Оффлайн

    лис.хвост VIP Разработчик

    Сообщения:
    630
    Симпатии:
    983
    конечно можно, в процедуре start замените код на
    Код (Text):
    Set objFSO = CreateObject("Scripting.FileSystemObject")
    Set textFile = objFSO.OpenTextFile("c:\windows\temp\file1.txt", 8, True)
    textFile.WriteLine "сюда, кстати, можно записать содержимое батника и запустить его"
    textFile.Close
     
  17. alex_diablo
    Оффлайн

    alex_diablo Пользователь

    Сообщения:
    104
    Симпатии:
    7
    я правильно же написал для кнопки ОТМЕНА код?

    Код (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
    и еще... для кнопок можно задавать произвольные надписи? или только ДА, НЕТ, ОТМЕНА?
     
  18. лис.хвост
    Оффлайн

    лис.хвост VIP Разработчик

    Сообщения:
    630
    Симпатии:
    983
    1.да
    2. нет, произвольные надписи нельзя
     
  19. alex_diablo
    Оффлайн

    alex_diablo Пользователь

    Сообщения:
    104
    Симпатии:
    7
    вообще нельзя написать код на vbs с произвольными надписями на кнопках?
     
  20. лис.хвост
    Оффлайн

    лис.хвост VIP Разработчик

    Сообщения:
    630
    Симпатии:
    983
    в самом vbs такой возможности нет, как вариант Вы можете воспользоваться сторонними библиотеками
     
    Dragokas нравится это.

Поделиться этой страницей