it-swarm.com.ru

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

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

30
Gutsygibbon

Что касается ответа 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"
30
dbenham
msg * "Enter Your Message"

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

42
shredder

Вы можете воспользоваться 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 будут приостанавливать пакетный файл до тех пор, пока не завершат свой сценарий, а затем разрешат файлу продолжить.

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

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

Примечание: Используя этот метод, доступны несколько конфигураций кнопок и значков для покрытия различных запросов yes/no/cancel/abort/retry к пользователю: https://technet.Microsoft.com/ ru-ru/library/ee156593.aspx

 enter image description here

19
James K

Еще несколько способов (во всех них скрипт ожидает нажатия кнопки в отличие от 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, он может без проблем вызываться как файл 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 отправлять сообщение только текущему пользователю.

16
npocmaka

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

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

4
user3176371

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

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

msg "Message",0,"Title"

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

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

Message.vbs %*
0
Lord C
@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
0
Ruan

msg * message goes here

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

pause >nul

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

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

@echo off

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

0
Cubit-Games

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

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

0
LittleBobbyTables

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

Поэтому установите переменную как 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

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

0
user3674709