Чи існує спосіб відображення вікна повідомлення з пакетного файлу (подібно до того, як xmessageможна використовувати bash-скрипти в Linux)?
Чи існує спосіб відображення вікна повідомлення з пакетного файлу (подібно до того, як xmessageможна використовувати bash-скрипти в Linux)?
Відповіді:
Я б створив дуже простий файл VBScript і назвав би його за допомогою CScript для розбору параметрів командного рядка.
Щось таке, як збережено в MessageBox.vbs:
Set objArgs = WScript.Arguments
messageText = objArgs(0)
MsgBox messageText
Ви б назвали:
cscript MessageBox.vbs "This will be shown in a popup."
MsgBoxдовідка, якщо вам цікаво пройти цей маршрут.
Перш за все, DOS не має до цього нічого спільного, ви, мабуть, хочете рішення командного рядка Windows (знову ж таки: немає DOS, чистий Windows, просто не вікно, а консоль).
Ви можете використовувати метод VBScript, наданий boflynn, або можете неправильно використовувати net sendабо msg. net sendпрацює лише на старих версіях Windows:
net send localhost Some message to display
Це також залежить від запущеної служби Messenger.
Для нових версій (XP і далі), мабуть):
msg "%username%" Some message to display
Слід зазначити, що вікно повідомлень, надіслане за допомогою, msg.exeтриватиме лише 60 секунд. Це , однак , може бути перевизначені з /time:xxперемикачем.
Може відобразити трохи спалаху, але тимчасові файли не потрібні. Має працювати весь шлях назад, десь в епоху IE5 (IIRC).
mshta javascript:alert("Message\n\nMultiple\nLines\ntoo!");close();
Не забувайте уникати своїх круглих дужок, якщо ви використовуєте if:
if 1 == 1 (
mshta javascript:alert^("1 is equal to 1, amazing."^);close^(^);
)
close() was unexpected at this time.
^знаки втечі у файлі bat
Це з'явиться ще одне вікно командного рядка:
START CMD /C "ECHO My Popup Message && PAUSE"
start cmd /c "@echo off & mode con cols=18 lines=2 & echo My Popup Message & pause>nul"змінити cols=18кількість символів у повідомленні + 2. І lines=2рівнозначна кількість рядків + 1.
cmd /k
Спробуйте:
Msg * "insert your message here"
Якщо ви використовуєте command.com's Windows XP, це відкриє вікно повідомлень.
Відкриття нового вікна cmd - це не зовсім те, про що ви просили, я збираюся. Ви також можете використовувати VBScript і використовувати це у файлі .bat. Ви відкриєте його з файлу bat з цією командою:
cd C:\"location of vbscript"
Це означає, що змінити каталог command.com буде шукати файли, а потім у наступному рядку:
"insert name of your vbscript here".vbs
Потім ви створюєте новий документ Блокнота , введіть
<script type="text/vbscript">
MsgBox "your text here"
</script>
Потім ви збережете це у форматі .vbs (поставивши ".vbs" в кінці імені файлу), збережіть як "Усі файли" у спадному вікні під назвою файлу (щоб він не зберігався як .txt ), а потім натисніть кнопку Зберегти!
<script/>тег.
msg *вам, вам буде запропоновано ввести повідомлення, а потім ctrl-Z. Ви можете ввести тут розриви рядків, які з’являться у вашому повідомленні.
Трохи більше способів.
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 і вище (незважаючи на те, що ОП не хочуть "зовнішніх" мов, JavaScript тут мінімізований). Потрібно зберегти як .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). Він знову використовує JavaScript, незважаючи на запит на 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="timed out";
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) і в кінці один єдиний виклик до shellhell, який створює спливаюче вікно (можна викликати з командного рядка або з пакетного пакету, якщо встановлено powerhell):
powershell [Reflection.Assembly]::LoadWithPartialName("""System.Windows.Forms""");[Windows.Forms.MessageBox]::show("""Hello World""", """My PopUp Message Box""")
6) І підхід dbenham, що спостерігається тут
start "" cmd /c "echo(&echo(&echo Hello world! &echo(&pause>nul"
7 ) Для сповіщень в системному треї ви можете спробувати це :
call SystemTrayNotification.bat -tooltip warning -time 3000 -title "Woow" -text "Boom" -icon question
Таким чином ваш пакетний файл створить сценарій VBS і покаже спливаюче вікно. Після запуску пакетний файл видалить цей проміжний файл.
Перевага використання MSGBOX полягає в тому, що він дійсно зберігається (змінити заголовок, піктограму тощо), тоді як MSG.exe не так вже й багато.
echo MSGBOX "YOUR MESSAGE" > %temp%\TEMPmessage.vbs
call %temp%\TEMPmessage.vbs
del %temp%\TEMPmessage.vbs /f /q
Ось варіант PowerShell, який не потребує завантаження збірок до створення вікна, однак він працює помітно повільніше (~ + 50%), ніж команда PowerShell MessageBox, розміщена тут @npocmaka:
powershell (New-Object -ComObject Wscript.Shell).Popup("""Operation Completed""",0,"""Done""",0x0)
Ви можете змінити останній параметр з "0x0" на значення нижче, щоб відобразити піктограми в діалоговому вікні (див. Метод спливаючих вікон для подальшої посилання):
0x10 Зупинка
0x20 Знак питання
0x30 Знак оклику
0x40 Інформаційний знак
Адаптовано зі статті Microsoft TechNet PowerTip: Використовуйте PowerShell для відображення спливаючого вікна .
echo X=MsgBox("Message Description",0+16,"Title") >msg.vbs
–Ви можете написати будь-які цифри від 0,1,2,3,4 замість 0 (перед символом "+"), і ось значення кожного номера:
0 = Ok Button
1 = Ok/Cancel Button
2 = Abort/Retry/Ignore button
3 = Yes/No/Cancel
4 = Yes/No
–Ви можете написати будь-які цифри від 16,32,48,64 замість 16 (після символу "+"), і ось значення кожного номера:
16 – Critical Icon
32 – Warning Icon
48 – Warning Message Icon
64 – Information Icon
Msgstr "" вставити своє повідомлення сюди "
добре працює, просто збережіть як .bat файл у блокноті або переконайтесь, що для формату встановлено значення "всі файли"
msg %SESSIONNAME% msg
msg * /time:0 /w Hello everybody!
Це повідомлення чекає вічно, поки не буде натиснути кнопку ОК (воно за замовчуванням триває лише одну хвилину) і справно працює в Windows 8.1
msg * /time:0 /w <C:\Somewhere\Message.txtде у файлі є звичайний текст (містить тексти CrLf).
Для цього вам потрібно мати невелику програму, яка відображає скриньку повідомлень і запускає це з вашого пакетного файлу.
Ви можете відкрити вікно консолі, яке відображає підказку, але отримати вікно повідомлення GUI за допомогою cmd.exe та лише друзів неможливо, AFAIK.
Я використовую тут утиліту з іменем msgbox.exe: http://www.paulsadowski.com/WSH/cmdprogs.htm
Після відповіді на @ Fowl, ви можете покращити його з тимчасовим часом, щоб він з’явився лише на 10 секунд, використовуючи наступне:
mshta "javascript:var sh=new ActiveXObject( 'WScript.Shell' ); sh.Popup( 'Message!', 10, 'Title!', 64 );close()"
Дивіться тут для більш детальної інформації.
Ви можете викликати функцію dll від user32.dll, я думаю, щось подібне
Rundll32.exe user32.dll, MessageBox (0, "текст", "titleText", {додаткові прапорці як найвища скринька повідомлень тощо})
Набравши його з мого телефону, не судіть мене ... інакше я б пов'язував зайві прапори.
rundll32.exe user32.dll,MessageBoxA Xщоб відобразити поле з повідомленнями X як заголовок, коли я це роблю у полі Виконати. Незалежно від того, що я роблю з X, я не можу змусити його інтерпретувати як декілька параметрів - все переходить у назву. Так rundll32.exe user32.dll,MessageBoxA (0, "MyTitle", "MyText", 0)відображається поле повідомлень із заголовком, (0, "MyTitle", "MyText", 0) але я не можу змусити його працювати ВСЕ з командного рядка - лише з поля Виконати. У командному рядку він взагалі нічого не робить. Це працює напевно з командного рядка або з пакетного файлу чи лише з поля Виконати?
msg * /server:127.0.0.1 Введіть тут своє повідомлення
where msgповертається C:\Windows\System32\msg.exe. Я думаю, що ти думаєшnet send
Ця програма може це зробити, якщо ви конвертуєте (обгортаєте) свої пакетні файли у виконувані файли.
Просте повідомлення
%extd% /messagebox Title Text
Повідомлення про помилку
%extd% /messagebox Error "Error message" 16
Скасувати Спробуйте ще раз
%extd% /messagebox Title "Try again or Cancel" 5
4) Повідомлення "Ніколи більше не запитай мене"
%extd% /messageboxcheck Title Message 0 {73E8105A-7AD2-4335-B694-94F837A38E79}
Кращий варіант
set my_message=Hello world&& start cmd /c "@echo off & mode con cols=15 lines=2 & echo %my_message% & pause>nul"
Опис:
lines= кількість рядків, плюс 1
cols= кількість символів у повідомленні, плюс 3 (Однак, мінімум має бути 15)
colsверсія:set my_message=Hello world&& (echo %my_message%>EMPTY_FILE123 && FOR %? IN (EMPTY_FILE123 ) DO SET strlength=%~z? && del EMPTY_FILE123 ) && start cmd /c "@echo off && mode con lines=2 cols=%strlength% && echo %my_message% && pause>nul"
start cmd /c "@echo off & mode con cols=18 lines=2 & echo My Popup Message & pause>nul"). Твій ні. Це повідомлення The screen cannot be set to the number of lines and columns specified.
xу поточному каталозі немає файлу, іменованого або ви не проти втратити його.
x, ваша команда просто не працює. Не дякуйте, і будь ласка, просто виправте свій код. Вам навіть не потрібно користуватися однолінійкою. І якщо ви вважаєте, що ваш код такий хороший, будь ласка, опублікуйте його в Code Review .
Ось мій пакетний сценарій, який я зібрав на основі хороших відповідей тут та інших публікацій
Ви можете встановити тайм-аут заголовка і навіть спати, щоб запланувати його для останнього & \ n для нового рядка
Назвіть це popup.bat і покладіть його у папку шляху Windows для роботи у глобальному масштабі на вашому ПК
Наприклад, popup Line 1\nLine 2буде створено спливаюче вікно з двома рядками (тип popup /?для використання)
Ось код
<!-- : Begin CMD
@echo off
cscript //nologo "%~f0?.wsf" %*
set pop.key=[%errorlevel%]
if %pop.key% == [-1] set pop.key=TimedOut
if %pop.key% == [1] set pop.key=Ok
if %pop.key% == [2] set pop.key=Cancel
if %pop.key% == [3] set pop.key=Abort
if %pop.key% == [4] set pop.key=Retry
if %pop.key% == [5] set pop.key=Ignore
if %pop.key% == [6] set pop.key=Yes
if %pop.key% == [7] set pop.key=No
if %pop.key% == [10] set pop.key=TryAgain
if %pop.key% == [11] set pop.key=Continue
if %pop.key% == [99] set pop.key=NoWait
exit /b
-- End CMD -->
<job><script language="VBScript">
'on error resume next
q =""""
qsq =""" """
Set objArgs = WScript.Arguments
Set objShell= WScript.CreateObject("WScript.Shell")
Popup = 0
Title = "Popup"
Timeout = 0
Mode = 0
Message = ""
Sleep = 0
button = 0
If objArgs.Count = 0 Then
Usage()
ElseIf objArgs(0) = "/?" or Lcase(objArgs(0)) = "-h" or Lcase(objArgs(0)) = "--help" Then
Usage()
End If
noWait = Not wait()
For Each arg in objArgs
If (Mid(arg,1,1) = "/") and (InStr(arg,":") <> 0) Then haveSwitch = True
Next
If not haveSwitch Then
Message=joinParam("woq")
Else
For i = 0 To objArgs.Count-1
If IsSwitch(objArgs(i)) Then
S=split(objArgs(i) , ":" , 2)
select case Lcase(S(0))
case "/m","/message"
Message=S(1)
case "/tt","/title"
Title=S(1)
case "/s","/sleep"
If IsNumeric(S(1)) Then Sleep=S(1)*1000
case "/t","/time"
If IsNumeric(S(1)) Then Timeout=S(1)
case "/b","/button"
select case S(1)
case "oc", "1"
button=1
case "ari","2"
button=2
case "ync","3"
button=3
case "yn", "4"
button=4
case "rc", "5"
button=5
case "ctc","6"
button=6
case Else
button=0
end select
case "/i","/icon"
select case S(1)
case "s","x","stop","16"
Mode=16
case "?","q","question","32"
Mode=32
case "!","w","warning","exclamation","48"
Mode=48
case "i","information","info","64"
Mode=64
case Else
Mode=0
end select
end select
End If
Next
End If
Message = Replace(Message,"/\n", "°" )
Message = Replace(Message,"\n",vbCrLf)
Message = Replace(Message, "°" , "\n")
If noWait Then button=0
Wscript.Sleep(sleep)
Popup = objShell.Popup(Message, Timeout, Title, button + Mode + vbSystemModal)
Wscript.Quit Popup
Function IsSwitch(Val)
IsSwitch = False
If Mid(Val,1,1) = "/" Then
For ii = 3 To 9
If Mid(Val,ii,1) = ":" Then IsSwitch = True
Next
End If
End Function
Function joinParam(quotes)
ReDim ArgArr(objArgs.Count-1)
For i = 0 To objArgs.Count-1
If quotes = "wq" Then
ArgArr(i) = q & objArgs(i) & q
Else
ArgArr(i) = objArgs(i)
End If
Next
joinParam = Join(ArgArr)
End Function
Function wait()
wait=True
If objArgs.Named.Exists("NewProcess") Then
wait=False
Exit Function
ElseIf objArgs.Named.Exists("NW") or objArgs.Named.Exists("NoWait") Then
objShell.Exec q & WScript.FullName & qsq & WScript.ScriptFullName & q & " /NewProcess: " & joinParam("wq")
WScript.Quit 99
End If
End Function
Function Usage()
Wscript.Echo _
vbCrLf&"Usage:" _
&vbCrLf&" popup followed by your message. Example: ""popup First line\nescaped /\n\nSecond line"" " _
&vbCrLf&" To triger a new line use ""\n"" within the msg string [to escape enter ""/"" before ""\n""]" _
&vbCrLf&"" _
&vbCrLf&"Advanced user" _
&vbCrLf&" If any Switch is used then you must use the /m: switch for the message " _
&vbCrLf&" No space allowed between the switch & the value " _
&vbCrLf&" The switches are NOT case sensitive " _
&vbCrLf&"" _
&vbCrLf&" popup [/m:""*""] [/t:*] [/tt:*] [/s:*] [/nw] [/i:*]" _
&vbCrLf&"" _
&vbCrLf&" Switch | value |Description" _
&vbCrLf&" -----------------------------------------------------------------------" _
&vbCrLf&" /m: /message:| ""1 2"" |if the message have spaces you need to quote it " _
&vbCrLf&" | |" _
&vbCrLf&" /t: /time: | nn |Duration of the popup for n seconds " _
&vbCrLf&" | |<Default> untill key pressed" _
&vbCrLf&" | |" _
&vbCrLf&" /tt: /title: | ""A B"" |if the title have spaces you need to quote it " _
&vbCrLf&" | | <Default> Popup" _
&vbCrLf&" | |" _
&vbCrLf&" /s: /sleep: | nn |schedule the popup after n seconds " _
&vbCrLf&" | |" _
&vbCrLf&" /nw /NoWait | |Continue script without the user pressing ok - " _
&vbCrLf&" | | botton option will be defaulted to OK button " _
&vbCrLf&" | |" _
&vbCrLf&" /i: /icon: | ?/q |[question mark]" _
&vbCrLf&" | !/w |[exclamation (warning) mark]" _
&vbCrLf&" | i/info|[information mark]" _
&vbCrLf&" | x/stop|[stop\error mark]" _
&vbCrLf&" | n/none|<Default>" _
&vbCrLf&" | |" _
&vbCrLf&" /b: /button: | o |[OK button] <Default>" _
&vbCrLf&" | oc |[OK and Cancel buttons]" _
&vbCrLf&" | ari |[Abort, Retry, and Ignore buttons]" _
&vbCrLf&" | ync |[Yes, No, and Cancel buttons]" _
&vbCrLf&" | yn |[Yes and No buttons]" _
&vbCrLf&" | rc |[Retry and Cancel buttons]" _
&vbCrLf&" | ctc |[Cancel and Try Again and Continue buttons]" _
&vbCrLf&" ---> | ---> |The output will be saved in variable ""pop.key""" _
&vbCrLf&"" _
&vbCrLf&"Example:" _
&vbCrLf&" popup /tt:""My MessageBox"" /t:5 /m:""Line 1\nLine 2\n/\n\nLine 4""" _
&vbCrLf&"" _
&vbCrLf&" v1.9 By RDR @ 2020"
Wscript.Quit
End Function
</script></job>
йому потрібно ТОЛЬКО спливати, коли знаходиться всередині vm, тому технічно повинен бути код, наприклад:
if %machine_type% == virtual_machine then
echo message box code
else
continue normal installation code