Apakah ada cara untuk menampilkan kotak pesan dari file batch (mirip dengan bagaimana xmessage
dapat digunakan dari bash-skrip di Linux)?
Apakah ada cara untuk menampilkan kotak pesan dari file batch (mirip dengan bagaimana xmessage
dapat digunakan dari bash-skrip di Linux)?
Jawaban:
Saya akan membuat file VBScript yang sangat sederhana dan menyebutnya menggunakan CScript untuk mem-parsing parameter baris perintah.
Sesuatu seperti yang tersimpan di bawah ini MessageBox.vbs
:
Set objArgs = WScript.Arguments
messageText = objArgs(0)
MsgBox messageText
Yang Anda sebut seperti:
cscript MessageBox.vbs "This will be shown in a popup."
MsgBox
referensi jika Anda tertarik untuk menempuh rute ini.
Pertama-tama, DOS tidak ada hubungannya dengan itu, Anda mungkin menginginkan solusi baris perintah Windows (sekali lagi: tidak ada DOS, Windows murni, hanya bukan Window, tetapi sebuah Konsol).
Anda bisa menggunakan metode VBScript yang disediakan oleh boflynn atau Anda bisa salah menggunakan net send
atau msg
. net send
hanya berfungsi pada versi windows yang lebih lama:
net send localhost Some message to display
Ini juga tergantung pada layanan Messenger yang harus dijalankan.
Untuk versi yang lebih baru (XP dan seterusnya, tampaknya):
msg "%username%" Some message to display
Perlu dicatat bahwa kotak pesan dikirim menggunakan msg.exe
hanya akan bertahan selama 60 detik. Namun ini bisa diganti dengan /time:xx
saklar.
Mungkin menampilkan sedikit flash, tetapi tidak perlu file temp. Harus bekerja sepanjang jalan kembali ke suatu tempat di era (IIRC) IE5.
mshta javascript:alert("Message\n\nMultiple\nLines\ntoo!");close();
Jangan lupa untuk keluar dari tanda kurung Anda jika Anda menggunakan if
:
if 1 == 1 (
mshta javascript:alert^("1 is equal to 1, amazing."^);close^(^);
)
close() was unexpected at this time
.
^
karakter pelarian itu dalam file kelelawar
Ini akan memunculkan jendela Prompt Perintah lainnya:
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"
ubah cols=18
ke jumlah karakter dalam pesan + 2. Dan lines=2
untuk berapa pun jumlah garis adalah +1.
cmd /k
Coba:
Msg * "insert your message here"
Jika Anda menggunakan command.com Windows XP, ini akan membuka kotak pesan.
Membuka jendela cmd baru tidak cukup dengan apa yang Anda minta, saya kumpulkan. Anda juga bisa menggunakan VBScript , dan menggunakannya dengan file .bat Anda. Anda akan membukanya dari file bat dengan perintah ini:
cd C:\"location of vbscript"
Apa yang dilakukan adalah mengubah command.com direktori akan mencari file dari, kemudian pada baris berikutnya:
"insert name of your vbscript here".vbs
Kemudian Anda membuat dokumen Notepad baru , ketikkan
<script type="text/vbscript">
MsgBox "your text here"
</script>
Anda kemudian akan menyimpan ini sebagai file .vbs (dengan meletakkan ".vbs" di akhir nama file), simpan sebagai "Semua File" di kotak drop-down di bawah nama file (sehingga tidak menyimpan sebagai .txt ), lalu klik Simpan!
<script/>
tag.
msg *
Anda akan diminta untuk memasukkan pesan diikuti oleh ctrl-Z. Anda dapat memasukkan jeda baris di sini yang akan muncul dalam pesan Anda.
Masih banyak cara.
1) Geekiest dan hackiest - menggunakan IEXPRESS untuk membuat exe kecil yang akan membuat pop-up dengan satu tombol ( ini dapat membuat dua jenis pesan pop-up lagi ). Bekerja pada SETIAP windows dari XP dan di atasnya:
;@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) Menggunakan MSHTA
. Juga bekerja pada setiap mesin windows dari XP dan di atasnya (meskipun OP tidak ingin bahasa "eksternal" JavaScript di sini diminimalkan). Harus disimpan sebagai .bat
:
@if (true == false) @end /*!
@echo off
mshta "about:<script src='file://%~f0'></script><script>close()</script>" %*
goto :EOF */
alert("Hello, world!");
atau dalam satu baris:
mshta "about:<script>alert('Hello, world!');close()</script>"
atau
mshta "javascript:alert('message');close()"
atau
mshta.exe vbscript:Execute("msgbox ""message"",0,""title"":close")
3) Inilah .bat/jscript
hibrid berparameter (harus disimpan sebagai bat
). Lagi-lagi menggunakan JavaScript meskipun ada permintaan OP, tetapi karena ia merupakan kelelawar, ia dapat disebut sebagai file kelelawar tanpa khawatir. Ini menggunakan POPUP yang memungkinkan sedikit lebih banyak kontrol daripada MSGBOX yang lebih populer . Ini menggunakan WSH, tetapi tidak MSHTA seperti pada contoh di atas.
@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) dan satu jscript.net/.bat
hybrid (harus disimpan sebagai .bat
). Kali ini menggunakan .NET
dan mengkompilasi .exe
file kecil yang dapat dihapus:
@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) dan pada akhirnya satu panggilan ke PowerShell yang membuat pop-up (dapat dipanggil dari command line atau dari batch jika PowerShell diinstal):
powershell [Reflection.Assembly]::LoadWithPartialName("""System.Windows.Forms""");[Windows.Forms.MessageBox]::show("""Hello World""", """My PopUp Message Box""")
6) Dan pendekatan dbenham terlihat di sini
start "" cmd /c "echo(&echo(&echo Hello world! &echo(&pause>nul"
7 ) Untuk pemberitahuan baki sistem Anda dapat mencoba ini :
call SystemTrayNotification.bat -tooltip warning -time 3000 -title "Woow" -text "Boom" -icon question
Dengan cara ini file batch Anda akan membuat skrip VBS dan menampilkan sembulan. Setelah berjalan, file batch akan menghapus file perantara itu.
Keuntungan menggunakan MSGBOX adalah benar-benar dapat dikustomisasi (mengubah judul, ikon dll) sementara MSG.exe tidak sebanyak itu.
echo MSGBOX "YOUR MESSAGE" > %temp%\TEMPmessage.vbs
call %temp%\TEMPmessage.vbs
del %temp%\TEMPmessage.vbs /f /q
Berikut adalah varian PowerShell yang tidak memerlukan pemuatan majelis sebelum membuat jendela, namun itu berjalan jauh lebih lambat (~ + 50%) daripada perintah PowerShell MessageBox yang diposting di sini oleh @npocmaka:
powershell (New-Object -ComObject Wscript.Shell).Popup("""Operation Completed""",0,"""Done""",0x0)
Anda dapat mengubah parameter terakhir dari "0x0" ke nilai di bawah ini untuk menampilkan ikon dalam dialog (lihat Metode Popup untuk referensi lebih lanjut):
0x10 Berhenti
0x20 Tanda Tanya
0x30 Tanda Seru
0x40 Tanda Informasi
Diadaptasi dari artikel Microsoft TechNet, PowerTip: Gunakan PowerShell untuk Menampilkan Jendela Munculan .
echo X=MsgBox("Message Description",0+16,"Title") >msg.vbs
–Anda dapat menulis angka apa saja dari 0,1,2,3,4 bukannya 0 (sebelum simbol '+') & di sini adalah arti dari setiap angka:
0 = Ok Button
1 = Ok/Cancel Button
2 = Abort/Retry/Ignore button
3 = Yes/No/Cancel
4 = Yes/No
–Anda dapat menulis angka apa saja dari 16,32,48,64 alih-alih 16 (setelah simbol '+') & di sini adalah arti dari setiap angka:
16 – Critical Icon
32 – Warning Icon
48 – Warning Message Icon
64 – Information Icon
Msg * "masukkan pesan Anda di sini"
berfungsi dengan baik, cukup simpan sebagai file .bat di notepad atau pastikan format diatur ke "semua file"
msg %SESSIONNAME% msg
msg * /time:0 /w Hello everybody!
Pesan ini menunggu selamanya sampai OK diklik (hanya berlangsung satu menit secara default) dan berfungsi dengan baik di Windows 8.1
msg * /time:0 /w <C:\Somewhere\Message.txt
di mana dalam file tersebut adalah teks normal (mengandung CrLf's).
Untuk melakukan ini, Anda harus memiliki program kecil yang menampilkan kotak pesan dan menjalankannya dari file batch Anda.
Anda bisa membuka jendela konsol yang menampilkan prompt, tetapi mendapatkan kotak pesan GUI menggunakan cmd.exe dan teman saja tidak mungkin, AFAIK.
Saya menggunakan utilitas bernama msgbox.exe dari sini: http://www.paulsadowski.com/WSH/cmdprogs.htm
Mengikuti pada jawaban @ Fowl, Anda dapat memperbaikinya dengan batas waktu hanya muncul selama 10 detik menggunakan yang berikut:
mshta "javascript:var sh=new ActiveXObject( 'WScript.Shell' ); sh.Popup( 'Message!', 10, 'Title!', 64 );close()"
Lihat di sini untuk detail lebih lanjut.
Anda dapat menjalankan fungsi dll dari user32.dll saya pikir Sesuatu seperti
Rundll32.exe user32.dll, MessageBox (0, "text", "titleText", {tanda tambahan untuk seperti kotak pesan paling atas dll})
Mengetiknya dari Ponsel saya, jangan menilai saya ... kalau tidak saya akan menautkan bendera tambahan.
rundll32.exe user32.dll,MessageBoxA X
menampilkan kotak pesan dengan X sebagai judul ketika saya melakukannya di kotak Jalankan. Apa pun yang saya buat X menjadi saya tidak bisa menafsirkannya sebagai beberapa parameter - semuanya masuk ke dalam judul. Jadi rundll32.exe user32.dll,MessageBoxA (0, "MyTitle", "MyText", 0)
menampilkan kotak pesan dengan judul (0, "MyTitle", "MyText", 0)
Tapi saya tidak bisa berfungsi sama sekali dari baris perintah - hanya dari kotak Jalankan. Di baris perintah tidak ada artinya sama sekali. Apakah ini bekerja dengan pasti dari baris perintah atau dari file batch atau hanya dari kotak Jalankan?
msg * /server:127.0.0.1 Ketikkan pesan Anda di sini
where msg
kembali C:\Windows\System32\msg.exe
. Saya pikir Anda memikirkannet send
Aplikasi ini dapat melakukannya, jika Anda mengkonversi (membungkus) file batch Anda menjadi file yang dapat dieksekusi.
Kotak pesan sederhana
%extd% /messagebox Title Text
Galat kotak pesan
%extd% /messagebox Error "Error message" 16
Batalkan Coba Lagi Kotak Pesan
%extd% /messagebox Title "Try again or Cancel" 5
4) "Jangan tanya aku lagi" Messagebox
%extd% /messageboxcheck Title Message 0 {73E8105A-7AD2-4335-B694-94F837A38E79}
Opsi yang lebih baik
set my_message=Hello world
&& start cmd /c "@echo off & mode con cols=15 lines=2 & echo %my_message% & pause>nul"
Deskripsi:
lines=
jumlah baris, ditambah 1
cols=
jumlah karakter dalam pesan, ditambah 3 (Namun, minimum harus 15
)
cols
Versi yang dihitung secara otomatis :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"
). Milikmu tidak. Ini menggemakan pesan tetapi gagal untuk mengatur ukuran jendela kembali The screen cannot be set to the number of lines and columns specified.
setidaknya di Windows 7.
x
di direktori saat ini atau Anda tidak keberatan kehilangan itu.
x
, perintah Anda gagal. Jangan berterima kasih kepada saya dan tolong perbaiki kode Anda. Anda bahkan tidak perlu menggunakan satu-liner. Dan jika menurut Anda kode Anda sangat bagus, silakan posting di Tinjauan Kode .
Ini adalah skrip kumpulan yang saya kumpulkan berdasarkan jawaban yang baik di sini & di pos lainnya
Anda dapat mengatur batas waktu judul & bahkan tidur untuk menjadwalkannya untuk yang terakhir & \ n untuk baris baru
Beri nama popup.bat & taruh di folder path windows Anda untuk bekerja secara global di pc Anda
Misalnya popup Line 1\nLine 2
akan menghasilkan kotak popup 2 baris (ketikpopup /?
untuk penggunaan)
Ini kodenya
<!-- : 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>
hanya perlu popup ketika berada di dalam vm, jadi secara teknis, harus ada beberapa kode seperti:
if %machine_type% == virtual_machine then
echo message box code
else
continue normal installation code