[CMD] InputBox и MsgBox в CMD

  • Автор темы Автор темы Foxik
  • Дата начала Дата начала
  • Теги Теги
    cmd

Foxik

Новый пользователь
Сообщения
41
Реакции
26
CMD/BATCH:
for /f "usebackq" %%i in (`mshta "vbscript:CreateObject("Scripting.FileSystemObject").GetStandardStream(1).Write(inputbox("1111","2222"))&Close()"`) do echo=%%i
Но с пробелами проблема....т.е. если в заголовке или тексте пробел то inputbox не вызываетя

CMD/BATCH:
for /f "delims=" %%i in ('mshta vbscript:Execute^("x=inputbox(""111"",""222""):Close()"^)') do echo %%i

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

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

CMD/BATCH:
@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.webp
 
Последнее редактирование:
Раз уж затронули тему InputBox, то и про MsgBox напишем:

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

MSG по-умолчанию воспринимает сообщения только в кодировке Win-1251, поэтому для обхода данного ограничения ... написал такое:
CMD/BATCH:
@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.webp
 
Последнее редактирование:
Речь о пробелах inputbox("11 11","22 22"). В заголовке или тексте....
MSG нет в Win 8.1, это сторонняя утилита?
 
Последнее редактирование:
Речь о пробелах inputbox("11 11","22 22"). В заголовке или тексте....
Понятно.
Тогда такие 2 варианта (благодарить ComSpec):

CMD/BATCH:
:: Вариант 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 нет в Win 8.1, это сторонняя утилита?
Забыл дополнить:

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

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
 
Последнее редактирование:
Назад
Сверху Снизу