Мне нужно знать, как создавать всплывающие сообщения в пакетных сценариях без, используя VBScript или KiXtart или любой другой внешний язык сценариев/программирования.
Я об этом не знаю... не было никакой отправной точки.
Я знаю NET SEND
, но служба Messenger отключена в моей текущей среде.
Как создать всплывающие сообщения в пакете script?
Ответ 1
Что касается ответа LittleBobbyTable - NET SEND не работает на Vista или Windows 7. Он был заменен MSG.EXE
Существует грубое решение, которое работает во всех версиях Windows. Сообщение о грубое всплывающее сообщение можно отправить, запустив новое окно cmd.exe, которое закрывается после нажатия клавиши.
start "" cmd /c "echo Hello world!&echo(&pause"
Если вы хотите, чтобы ваш script останавливался до тех пор, пока окно сообщения не будет уволено, вы можете добавить параметр /WAIT.
start "" /wait cmd /c "echo Hello world!&echo(&pause"
Ответ 2
msg * "Enter Your Message"
Помогает ли это?
Ответ 3
Вы можете использовать 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
будут действовать одинаково. При вызове из командного файла bot cscript
и wscript
приостанавливают пакетный файл до тех пор, пока они не закончат их script, а затем разрешите продолжить файл.
При вызове вручную из командной строки cscript
не вернет управление в командную строку до тех пор, пока она не будет завершена, а wscript
создаст отдельный поток для выполнения script, возвращая управление команде запрос еще до его завершения script.
Другие методы, обсуждаемые в этом потоке, не приводят к приостановке пакетных файлов, ожидая нажатия на сообщение. Ваш выбор будет продиктован вашими потребностями.
Ответ 4
Несколько способов (во всех из них script ждет нажатия кнопки в отличие от msg.exe
).
1) Geekiest и hackiest - он использует 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 отправлять сообщение только текущему пользователю.
Ответ 5
msg * Привет мир
работает для меня..
Ответ 6
Лучше всего использовать NET SEND
, как описано на сайте Rob van der Woude.
В противном случае вам нужно будет использовать внешнюю программу сценариев. Пакетные файлы действительно предназначены для отправки сообщений через ECHO
.
Ответ 7
@echo off
title message
echo what the password?
set/p "pass=>"
if not %pass% == password goto fail
msg *correct: Correct password!!!
goto end
:fail
msg *wrong: Wrong password!!!
:end
Ответ 8
Это очень просто, я создал пару строк кода, которые сделают это для вас
Итак, установите переменную как msg, а затем используйте этот код. он появится в окне сообщения VBS.
CODE:
@echo off
echo %msg% >vbs.txt
copy vbs.txt vbs.vbs
del vbs.txt
start vbs.vbs
timeout /t 1
del vbs.vbs
cls
Это то, что я придумал, оно должно работать для большинства ваших потребностей в сообщениях, а также работает с пробелами, в отличие от некоторых пакетных скриптов
Ответ 9
Легко сделать сообщение, вот как:
Сначала откройте notpad и введите:
msg "Message",0,"Title"
и сохраните его как Message.vbs.
Теперь в вашем типе пакетного файла:
Message.vbs %*
Ответ 10
msg * message goes here
Этот метод очень прост и прост и должен работать в любом пакетном файле, на который я верю. Единственным недостатком этого метода является то, что он может отображать только одно сообщение сразу, если есть несколько сообщений, они будут отображаться каждый за другим в зависимости от того, какой заказ вы поместили в код. Также убедитесь, что в вашем пакетном файле есть другой цикл или непрерывный оператор, или он автоматически закроется, и появится только это сообщение. Если вам нужен "тихий" фоновой цикл, то один из них:
pause >nul
Это должно задержать его, но затем оно закроется после нажатия кнопки.
Также, чтобы все команды были "тихими" при запуске, поэтому они просто запускают и не отображают, что они были введены в файл, просто поместите следующую строку в начало командного файла:
@echo off
Я надеюсь, что все эти советы помогли!