Как вы можете создавать всплывающие сообщения в пакетном скрипте?

Мне нужно знать, как создавать всплывающие сообщения в пакетных сценариях без использования VBScript или KiXtart или любого другого внешнего языка сценариев / программирования. Я понятия не имею об этом... не было даже отправной точки. Я в курсе NET SEND но служба Messenger отключена в моей текущей среде.

10 ответов

Решение

Что касается ответа LittleBobbyTable - NET SEND не работает в Vista или Windows 7. Его заменил MSG.EXE.

Существует грубое решение, которое работает во всех версиях Windows. Необработанное всплывающее сообщение можно отправить, запустив новое окно cmd.exe, которое закрывается после нажатия клавиши.

start "" cmd /c "echo Hello world!&echo(&pause"

Если вы хотите, чтобы ваш сценарий приостанавливался до тех пор, пока окно сообщения не будет закрыто, вы можете добавить параметр /WAIT.

start "" /wait cmd /c "echo Hello world!&echo(&pause"
msg * "Enter Your Message"

Это помогает?

Вы можете воспользоваться CSCRIPT.EXE или же WSCRIPT.EXE (которые присутствовали в каждой версии Windows начиная с, я полагаю, Windows 95) следующим образом:

echo msgbox "Hey! Here is a message!" > %tmp%\tmp.vbs
cscript /nologo %tmp%\tmp.vbs
del %tmp%\tmp.vbs

или же

echo msgbox "Hey! Here is a message!" > %tmp%\tmp.vbs
wscript %tmp%\tmp.vbs
del %tmp%\tmp.vbs

Вы также можете выбрать более настраиваемый PopUp команда. Этот пример дает вам 10-секундное окно, чтобы нажать OK, прежде чем истечет время ожидания:

echo set WshShell = WScript.CreateObject("WScript.Shell") > %tmp%\tmp.vbs
echo WScript.Quit (WshShell.Popup( "You have 10 seconds to Click 'OK'." ,10 ,"Click OK", 0)) >> %tmp%\tmp.vbs
cscript /nologo %tmp%\tmp.vbs
if %errorlevel%==1 (
  echo You Clicked OK
) else (
  echo The Message timed out.
)
del %tmp%\tmp.vbs

В вышеприведенном контексте оба cscript а также wscript будет действовать так же. Когда вызывается из командного файла, бот cscript а также wscript приостановит пакетный файл, пока они не закончат свой сценарий, затем разрешит файлу продолжить.

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

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

Примечание. Используя этот метод, доступны несколько конфигураций кнопок и значков для удовлетворения различных запросов пользователя: да / нет / отмена / отмена / повторная попытка: https://technet.microsoft.com/en-us/library/ee156593.aspx

Еще несколько способов (во всех из них скрипт ждет нажатия кнопки в отличие от msg.exe).

1) Самый отвратительный и хакерский - он использует IEXPRESS для создания небольшого exe-файла, который создаст всплывающее окно с помощью одной кнопки ( он может создавать еще два типа всплывающих сообщений). Работает на КАЖДЫХ окнах от XP и выше:

;@echo off
;setlocal

;set ppopup_executable=popupe.exe
;set "message2=click OK to continue"
;
;del /q /f %tmp%\yes >nul 2>&1
;
;copy /y "%~f0" "%temp%\popup.sed" >nul 2>&1

;(echo(FinishMessage=%message2%)>>"%temp%\popup.sed";
;(echo(TargetName=%cd%\%ppopup_executable%)>>"%temp%\popup.sed";
;(echo(FriendlyName=%message1_title%)>>"%temp%\popup.sed"
;
;iexpress /n /q /m %temp%\popup.sed
;%ppopup_executable%
;rem del /q /f %ppopup_executable% >nul 2>&1

;pause

;endlocal
;exit /b 0


[Version]
Class=IEXPRESS
SEDVersion=3
[Options]
PackagePurpose=InstallApp
ShowInstallProgramWindow=1
HideExtractAnimation=1
UseLongFileName=0
InsideCompressed=0
CAB_FixedSize=0
CAB_ResvCodeSigning=0
RebootMode=N
InstallPrompt=%InstallPrompt%
DisplayLicense=%DisplayLicense%
FinishMessage=%FinishMessage%
TargetName=%TargetName%
FriendlyName=%FriendlyName%
AppLaunched=%AppLaunched%
PostInstallCmd=%PostInstallCmd%
AdminQuietInstCmd=%AdminQuietInstCmd%
UserQuietInstCmd=%UserQuietInstCmd%
SourceFiles=SourceFiles
[SourceFiles]
SourceFiles0=C:\Windows\System32\
[SourceFiles0]
%FILE0%=


[Strings]
AppLaunched=subst.exe
PostInstallCmd=<None>
AdminQuietInstCmd=
UserQuietInstCmd=
FILE0="subst.exe"
DisplayLicense=
InstallPrompt=

2) Использование MSHTA, Также работает на любой машине с Windows от XP и выше (несмотря на то, что OP не хочет "внешних" языков, jsvascript здесь сведен к минимуму). Должен быть сохранен как .bat:

@if (true == false) @end /*!
@echo off
mshta "about:<script src='file://%~f0'></script><script>close()</script>" %*
goto :EOF */

alert("Hello, world!");

или в одну строку:

mshta "about:<script>alert('Hello, world!');close()</script>"

или же

mshta "javascript:alert('message');close()"

или же

mshta.exe vbscript:Execute("msgbox ""message"",0,""title"":close")

3) Здесь параметризован .bat/jscript гибрид (должен быть сохранен как bat). Он снова использует jscript, несмотря на запрос OP, но, поскольку это летучая мышь, он может без проблем вызываться как файл bat. Он использует POPUP, который позволяет немного больше контроля, чем более популярные MSGBOX. Он использует WSH, но не MSHTA. как в примере выше.

 @if (@x)==(@y) @end /***** jscript comment ******
     @echo off

     cscript //E:JScript //nologo "%~f0" "%~nx0" %*
     exit /b 0

 @if (@x)==(@y) @end ******  end comment *********/


var wshShell = WScript.CreateObject("WScript.Shell");
var args=WScript.Arguments;
var title=args.Item(0);

var timeout=-1;
var pressed_message="button pressed";
var timeout_message="timedout";
var message="";

function printHelp() {
    WScript.Echo(title + "[-title Title] [-timeout m] [-tom \"Time-out message\"] [-pbm \"Pressed button message\"]  [-message \"pop-up message\"]");
}

if (WScript.Arguments.Length==1){
    runPopup();
    WScript.Quit(0);
}

if (args.Item(1).toLowerCase() == "-help" ||  args.Item(1).toLowerCase() == "-h" ) {
    printHelp();
    WScript.Quit(0);
}

if (WScript.Arguments.Length % 2 == 0 ) {
    WScript.Echo("Illegal arguments ");
    printHelp();
    WScript.Quit(1);
}

for (var arg = 1 ; arg<args.Length;arg=arg+2) {

    if (args.Item(arg).toLowerCase() == "-title") {
        title = args.Item(arg+1);
    }

    if (args.Item(arg).toLowerCase() == "-timeout") {
        timeout = parseInt(args.Item(arg+1));
        if (isNaN(timeout)) {
            timeout=-1;
        }
    }

    if (args.Item(arg).toLowerCase() == "-tom") {
        timeout_message = args.Item(arg+1);
    }

    if (args.Item(arg).toLowerCase() == "-pbm") {
        pressed_message = args.Item(arg+1);
    }

    if (args.Item(arg).toLowerCase() == "-message") {
        message = args.Item(arg+1);
    }
}

function runPopup(){
    var btn = wshShell.Popup(message, timeout, title, 0x0 + 0x10);

    switch(btn) {
        // button pressed.
        case 1:
            WScript.Echo(pressed_message);
            break;

        // Timed out.
        case -1:
           WScript.Echo(timeout_message);
           break;
    }
}

runPopup();

4) и один jscript.net/.bat гибрид (должен быть сохранен как .bat). Это время он использует .NET и составляет небольшой .exe файл, который можно удалить:

@if (@X)==(@Y) @end /****** silent jscript comment ******

@echo off
::::::::::::::::::::::::::::::::::::
:::       compile the script    ::::
::::::::::::::::::::::::::::::::::::
setlocal


::if exist "%~n0.exe" goto :skip_compilation

:: searching the latest installed .net framework
for /f "tokens=* delims=" %%v in ('dir /b /s /a:d /o:-n "%SystemRoot%\Microsoft.NET\Framework\v*"') do (
    if exist "%%v\jsc.exe" (
        rem :: the javascript.net compiler
        set "jsc=%%~dpsnfxv\jsc.exe"
        goto :break_loop
    )
)
echo jsc.exe not found && exit /b 0
:break_loop



call %jsc% /nologo /out:"%~n0.exe" "%~f0" 
::::::::::::::::::::::::::::::::::::
:::       end of compilation    ::::
::::::::::::::::::::::::::::::::::::
:skip_compilation

::
::::::::::
"%~n0.exe" %*
::::::::
::
endlocal
exit /b 0

****** end of jscript comment ******/

import System;
import System.WIndows;
import System.Windows.Forms

var arguments:String[] = Environment.GetCommandLineArgs();
MessageBox.Show(arguments[1],arguments[0]);

5) и в конце один единственный вызов powershell, который создает всплывающее окно (может вызываться из командной строки или из пакета, если установлен powershell):

powershell [Reflection.Assembly]::LoadWithPartialName("""System.Windows.Forms""");[Windows.Forms.MessageBox]::show("""Hello World""", """My PopUp Message Box""")

6) Хотя msg Решение уже опубликовано в качестве ответа вот лучший способ использовать:

msg * /self /w "hello world"

/self это недокументированный переключатель, который заставит msg отправлять сообщение только текущему пользователю.

msg * Привет, мир

работает для меня..

Я собрал сценарий на основе хороших ответов здесь и в других сообщениях

Вы можете установить тайм-аут заголовка и даже сон, чтобы запланировать его для последнего & \n для новой строки

также вы возвращаете нажатие клавиши в переменную (%pop.key%).

Вот мой код

Итак, представляю cmdmsg.bat.

Код такой:

@echo off
echo WScript.Quit MsgBox(%1, vbYesNo) > #.vbs
cscript //nologo #.vbs
echo. >%ERRORLEVEL%.cm
del #.vbs
exit /b

И пример файла:

@echo off 
cls 
call cmdmsg "hi select yes or no"

if exist "6.cm" call :yes
if exist "7.cm" call :no

:yes
cls
if exist "6.cm" del 6.cm
if exist "7.cm" del 7.cm
echo.
echo you selected yes
echo.
pause >nul
exit /b

:no
cls
if exist "6.cm" del 6.cm
if exist "7.cm" del 7.cm
echo.
echo aw man, you selected no
echo.
pause >nul
exit /b

Это очень просто, потому что я создал пару строк кода, который сделает это для вас

Поэтому установите переменную как msg, а затем используйте этот код. это всплывающее окно в окне сообщения VBS.

КОД:

@echo off
echo %msg% >vbs.txt
copy vbs.txt vbs.vbs
del vbs.txt
start vbs.vbs
timeout /t 1
del vbs.vbs
cls

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

@echo off
title message

echo what's the password?
set/p "pass=>"

if not %pass% == password goto fail
msg *correct: Correct password!!!
goto end

:fail
msg *wrong: Wrong password!!!

:end

msg * message goes here

Этот метод очень прост и легок и должен работать в любом командном файле, я верю. Единственным "недостатком" этого метода является то, что он может показывать только 1 сообщение одновременно, если существует более одного сообщения, он будет показывать каждое сообщение за другим, в зависимости от порядка их размещения в коде. Также убедитесь, что в вашем пакетном файле есть другой оператор зацикливания или непрерывный оператор, иначе он закроется автоматически, и появится только это сообщение. Если вам нужен "тихий" оператор фонового зацикливания, вот он:

pause >nul

Это должно поддерживать его работу, но затем он закроется после нажатия кнопки.

Также, чтобы все команды были тихими при запуске, чтобы они просто запускались и не отображали, что они были введены в файл, просто поместите следующую строку в начало командного файла:

@echo off

Я надеюсь, что все эти советы помогли!

Это легко сделать сообщение, вот как:

Сначала откройте notpad и наберите:

msg "Message",0,"Title"

и сохраните его как Message.vbs.

Теперь в вашем типе командного файла:

Message.vbs %*

Лучше всего использовать NET SEND как задокументировано на сайте Роба ван дер Вуде.

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

Другие вопросы по тегам