InputBox и MsgBox в CMD

Тема в разделе "Пакетные файлы CMD, BAT", создана пользователем Foxik, 23 фев 2016.

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

    Foxik Новый пользователь

    Сообщения:
    24
    Симпатии:
    10
    Код (DOS):
    for /f "usebackq" %%i in (`mshta "vbscript:CreateObject("Scripting.FileSystemObject").GetStandardStream(1).Write(inputbox("1111","2222"))&Close()"`) do echo=%%i
    Но с пробелами проблема....т.е. если в заголовке или тексте пробел то inputbox не вызываетя

    Код (DOS):
    for /f "delims=" %%i in ('mshta vbscript:Execute^("x=inputbox(""111"",""222""):Close()"^)') do echo %%i
    А в этом варианте в переменную i не передаются данные
     
    Последнее редактирование: 23 фев 2016
  2. Dragokas
    Оффлайн

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

    Сообщения:
    4.493
    Симпатии:
    4.310
    Разумеется. Значение остается во внутренней переменной "x" VBScript, обернутого в mshta.
    Чтобы его передать обратно в CMD, следует подключится к стандартному потоку #1, и писать данные в него (как в 1-м варианте).

    Для for /f стандартными разделителями токенов являются пробел и знак табуляции. У Вас в консоль выводится только 1-й токен.
    Нужно обнулять список разделителей:

    Код (DOS):
    @echo off
    SetLocal EnableExtensions

    for /f "usebackq delims=" %%i in (`mshta "vbscript:CreateObject("Scripting.FileSystemObject").GetStandardStream(1).Write(inputbox("1111","2222"))&Close()"`) do set "var=%%i"
    echo Значение = "%var%"

    pause >NUL
    goto :eof
    либо "usebackq tokens=*" (tokens=* - вывести все токены).

    Screenshot_1.png
     
    Последнее редактирование: 23 фев 2016
  3. Dragokas
    Оффлайн

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

    Сообщения:
    4.493
    Симпатии:
    4.310
    Раз уж затронули тему InputBox, то и про MsgBox напишем:

    Отображение сообщения MSG в несколько строк из батника в кодировке OEM-866

    MSG по-умолчанию воспринимает сообщения только в кодировке Win-1251, поэтому для обхода данного ограничения ... написал такое:
    Код (DOS):

    @echo off
    SetLocal EnableExtensions
    call :msg "Строка № 1 \nСтрока № 2"
    pause
    Exit /B

    :msg
      chcp 866 >NUL& for /F "delims=" %%a in ("%~1") do chcp 1251 >NUL& call :convert "%%~a"& chcp 866 >NUL& Exit /B
    :convert
      set "text=%~1"
      (@for %%a in ("%text:\n=" "%") do @echo.%%~a) | msg *
    Exit /B
     
    (батник в кодировке OEM-866).
    Чтобы имитировать перенос каретки, используйте \n, как в примере.

    msg.png
     
    Последнее редактирование: 23 фев 2016
    Kиpилл нравится это.
  4. Foxik
    Оффлайн

    Foxik Новый пользователь

    Сообщения:
    24
    Симпатии:
    10
    Речь о пробелах inputbox("11 11","22 22"). В заголовке или тексте....
    --- Объединённое сообщение, 23 фев 2016 ---
    MSG нет в Win 8.1, это сторонняя утилита?
     
    Последнее редактирование: 23 фев 2016
  5. Dragokas
    Оффлайн

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

    Сообщения:
    4.493
    Симпатии:
    4.310
    Понятно.
    Тогда такие 2 варианта (благодарить ComSpec):

    Код (DOS):
    :: Вариант 1:
    for /f "usebackq tokens=*" %%i in (`mshta "vbscript:CreateObject("Scripting.FileSystemObject").GetStandardStream(1).Write(inputbox("11"&Chr(32)&"11","22"&Chr(32)&"22"))&Close()"`) do set "var=%%i"
    echo Значение = "%var%"

    :: Вариант 2:

    for /f "usebackq tokens=*" %%i in (`mshta vbscript:Execute("CreateObject(""Scripting.FileSystemObject"").GetStandardStream(1).Write(inputbox(""11 11"",""22 22""))&Close()"^)`) do set "var=%%i"
    echo Значение = "%var%"
    Забыл дополнить:

    Утилита msg.exe вырезана из Windows 8.0 (хотя и есть в папке WinSxS), возможно и в каких-то из редакций 8.1. ее нет.
    Также ее нет в папке SysWOW64. Поэтому, если Вы запускаете батник из-под 32-битного файлового менеджера на x64-битной системе, то MSG не запустится.
     
  6. Foxik
    Оффлайн

    Foxik Новый пользователь

    Сообщения:
    24
    Симпатии:
    10
    Отличный вариант, спс
     
    Последнее редактирование: 25 фев 2016
  7. Dragokas
    Оффлайн

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

    Сообщения:
    4.493
    Симпатии:
    4.310
    Функция MsgBox на CMD:

    Код (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илл нравится это.

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