C'è un modo per visualizzare una finestra di messaggio da un file batch (simile a come xmessage
può essere usato da bash-script in Linux)?
C'è un modo per visualizzare una finestra di messaggio da un file batch (simile a come xmessage
può essere usato da bash-script in Linux)?
Risposte:
Vorrei creare un file VBScript molto semplice e chiamarlo utilizzando CScript per analizzare i parametri della riga di comando.
Qualcosa come il seguente salvato in MessageBox.vbs
:
Set objArgs = WScript.Arguments
messageText = objArgs(0)
MsgBox messageText
Che chiameresti come:
cscript MessageBox.vbs "This will be shown in a popup."
MsgBox
riferimento se sei interessato a percorrere questa strada.
Prima di tutto, DOS non ha nulla a che fare con esso, probabilmente vuoi una soluzione da riga di comando di Windows (di nuovo: niente DOS, Windows puro, non solo una Finestra, ma una Console).
È possibile utilizzare il metodo VBScript fornito da boflynn oppure utilizzare in modo errato net send
o msg
. net send
funziona solo su versioni precedenti di Windows:
net send localhost Some message to display
Questo dipende anche dal servizio Messenger, tuttavia.
Per le versioni più recenti (XP e successive, apparentemente):
msg "%username%" Some message to display
Va notato che una finestra di messaggio inviata utilizzando msg.exe
durerà solo 60 secondi. Questo può tuttavia essere ignorato con l' /time:xx
interruttore.
Potrebbe visualizzare un po 'di flash, ma non sono necessari file temporanei. Dovrebbe funzionare fino a qualche parte dell'era IE5 (IIRC).
mshta javascript:alert("Message\n\nMultiple\nLines\ntoo!");close();
Non dimenticare di sfuggire alle parentesi se stai usando if
:
if 1 == 1 (
mshta javascript:alert^("1 is equal to 1, amazing."^);close^(^);
)
close() was unexpected at this time
.
^
personaggi di escape in un file bat
Verrà visualizzata un'altra finestra del prompt dei comandi:
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"
modifica cols=18
la quantità di caratteri nel messaggio + 2. E il lines=2
qualunque sia la quantità di righe è + 1.
cmd /k
Provare :
Msg * "insert your message here"
Se si utilizza command.com di Windows XP, si aprirà una finestra di messaggio.
L'apertura di una nuova finestra cmd non è proprio quello che stavi chiedendo, mi pare. Puoi anche usare VBScript e usarlo con il tuo file .bat. Lo apriresti dal file bat con questo comando:
cd C:\"location of vbscript"
Quello che fa è cambiare la directory command.com cercherà i file da, quindi nella riga successiva:
"insert name of your vbscript here".vbs
Quindi si crea un nuovo documento di Blocco note , digitare
<script type="text/vbscript">
MsgBox "your text here"
</script>
Dovresti quindi salvarlo come file .vbs (inserendo ".vbs" alla fine del nome file), salvalo come "Tutti i file" nella casella a discesa sotto il nome del file (quindi non viene salvato come .txt ), quindi fai clic su Salva!
<script/>
tag.
msg *
ti verrà richiesto di inserire un messaggio seguito da ctrl-Z. Puoi inserire qui delle interruzioni di riga che verranno visualizzate nel tuo messaggio.
Pochi altri modi.
1) Il più geek e hacker - usa IEXPRESS per creare un piccolo exe che creerà un pop-up con un solo pulsante ( può creare altri due tipi di messaggi pop-up ). Funziona su OGNI Windows da XP in poi:
;@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) Utilizzo MSHTA
. Funziona anche su tutti i computer Windows da XP e superiori (nonostante l'OP non desideri linguaggi "esterni", il JavaScript qui è ridotto a icona). Dovrebbe essere salvato come .bat
:
@if (true == false) @end /*!
@echo off
mshta "about:<script src='file://%~f0'></script><script>close()</script>" %*
goto :EOF */
alert("Hello, world!");
o in una riga:
mshta "about:<script>alert('Hello, world!');close()</script>"
o
mshta "javascript:alert('message');close()"
o
mshta.exe vbscript:Execute("msgbox ""message"",0,""title"":close")
3) Ecco un .bat/jscript
ibrido parametrizzato (dovrebbe essere salvato comebat
). Utilizza nuovamente JavaScript nonostante la richiesta OP, ma essendo un pipistrello può essere chiamato come file bat senza preoccupazioni. Utilizza POPUP che consente un po 'più controllo rispetto al più popolare MSGBOX . Utilizza WSH, ma non MSHTA come nell'esempio sopra.
@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) e uno jscript.net/.bat
ibrido (dovrebbe essere salvato come .bat
). Questa volta utilizza .NET
e compila un piccolo .exe
file che potrebbe essere eliminato:
@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) e alla fine una singola chiamata a PowerShell che crea un pop-up (può essere chiamato dalla riga di comando o dal batch se PowerShell è installato):
powershell [Reflection.Assembly]::LoadWithPartialName("""System.Windows.Forms""");[Windows.Forms.MessageBox]::show("""Hello World""", """My PopUp Message Box""")
6) E l'approccio del dbenham visto qui
start "" cmd /c "echo(&echo(&echo Hello world! &echo(&pause>nul"
7 ) Per le notifiche di una barra delle applicazioni puoi provare questo :
call SystemTrayNotification.bat -tooltip warning -time 3000 -title "Woow" -text "Boom" -icon question
In questo modo il tuo file batch creerà uno script VBS e mostrerà un popup. Dopo l'esecuzione, il file batch eliminerà quel file intermedio.
Il vantaggio dell'utilizzo di MSGBOX è che è davvero personalizzabile (cambia il titolo, l'icona ecc.) Mentre MSG.exe non è così tanto.
echo MSGBOX "YOUR MESSAGE" > %temp%\TEMPmessage.vbs
call %temp%\TEMPmessage.vbs
del %temp%\TEMPmessage.vbs /f /q
Ecco una variante di PowerShell che non richiede il caricamento di assembly prima di creare la finestra, tuttavia è notevolmente più lenta (~ + 50%) rispetto al comando MessageBox di PowerShell pubblicato qui da @npocmaka:
powershell (New-Object -ComObject Wscript.Shell).Popup("""Operation Completed""",0,"""Done""",0x0)
È possibile modificare l'ultimo parametro da "0x0" a un valore inferiore per visualizzare le icone nella finestra di dialogo (vedere Metodo popup per ulteriori riferimenti):
0x10 Stop
0x20 Punto interrogativo
0x30 Punto esclamativo
0x40 Punto informativo
Adattato dall'articolo di Microsoft TechNet Suggerimento: utilizzare PowerShell per visualizzare la finestra a comparsa .
echo X=MsgBox("Message Description",0+16,"Title") >msg.vbs
–Puoi scrivere qualsiasi numero compreso tra 0,1,2,3,4 anziché 0 (prima del simbolo '+') e qui c'è il significato di ogni numero:
0 = Ok Button
1 = Ok/Cancel Button
2 = Abort/Retry/Ignore button
3 = Yes/No/Cancel
4 = Yes/No
–Puoi scrivere qualsiasi numero da 16,32,48,64 invece di 16 (dopo il simbolo '+') e qui c'è il significato di ogni numero:
16 – Critical Icon
32 – Warning Icon
48 – Warning Message Icon
64 – Information Icon
Messaggio * "inserisci il tuo messaggio qui"
funziona bene, basta salvare come file .bat nel blocco note o assicurarsi che il formato sia impostato su "tutti i file"
msg %SESSIONNAME% msg
msg * /time:0 /w Hello everybody!
Questo messaggio attende per sempre fino a quando si fa clic su OK (per impostazione predefinita dura solo un minuto) e funziona correttamente in Windows 8.1
msg * /time:0 /w <C:\Somewhere\Message.txt
dove nel file è testo normale (contenente CrLf).
Per fare ciò, è necessario disporre di un piccolo programma che visualizza una finestra di messaggio ed eseguirlo dal file batch.
È possibile aprire una finestra della console che visualizza un prompt, ma non è possibile ottenere una finestra di messaggio della GUI utilizzando solo cmd.exe e gli amici, AFAIK.
Uso un'utilità denominata msgbox.exe da qui: http://www.paulsadowski.com/WSH/cmdprogs.htm
È possibile richiamare la funzione dll da user32.dll penso che qualcosa del genere
Rundll32.exe user32.dll, MessageBox (0, "text", "titleText", {flag extra per la casella dei messaggi più in alto, ecc})
Digitando dal mio telefono, non giudicarmi ... altrimenti collegherei le bandiere extra.
rundll32.exe user32.dll,MessageBoxA X
visualizzare una finestra di messaggio con X come titolo quando lo faccio nella casella Esegui. Indipendentemente da ciò che creo, X non riesco a interpretarlo come più parametri: tutto va nel titolo. Quindi rundll32.exe user32.dll,MessageBoxA (0, "MyTitle", "MyText", 0)
visualizza una finestra di messaggio con il titolo (0, "MyTitle", "MyText", 0)
Ma non riesco a farlo funzionare affatto dalla riga di comando - solo dalla casella Esegui. Sulla riga di comando non fa nulla. Funziona sicuramente da una riga di comando o da un file batch o solo dalla casella Esegui?
msg * /server:127.0.0.1 Digita qui il tuo messaggio
where msg
ritorna C:\Windows\System32\msg.exe
. Penso che tu stia pensandonet send
Questa applicazione può farlo, se converti (avvolgi) i tuoi file batch in file eseguibili.
Messagebox semplice
%extd% /messagebox Title Text
Error Messagebox
%extd% /messagebox Error "Error message" 16
Annulla Riprova Messagebox
%extd% /messagebox Title "Try again or Cancel" 5
4) Messagebox "Non chiedermelo più"
%extd% /messageboxcheck Title Message 0 {73E8105A-7AD2-4335-B694-94F837A38E79}
Un'opzione migliore
set my_message=Hello world
&& start cmd /c "@echo off & mode con cols=15 lines=2 & echo %my_message% & pause>nul"
Descrizione:
lines=
quantità di righe, più 1
cols=
quantità di caratteri nel messaggio, più 3 (Tuttavia, il minimo deve essere 15
)
cols
Versione calcolata automaticamente :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"
). Il tuo no. Fa eco al messaggio ma non riesce a impostare la dimensione della finestra che ritorna The screen cannot be set to the number of lines and columns specified.
almeno nel mio Windows 7.
x
nella directory corrente o non ti dispiaccia perderlo.
x
, il comando non riesce. Non ringraziarmi e per favore correggi il tuo codice. Non hai nemmeno bisogno di usare un liner. E se ritieni che il tuo codice sia così buono, per favore pubblicalo in Code Review .
Ecco il mio script batch che ho messo insieme sulla base delle buone risposte qui e in altri post
Puoi impostare il timeout del titolo e persino la sospensione per programmarlo per quest'ultimo & \ n per la nuova riga
Denominalo popup.bat e mettilo nella cartella del tuo percorso di Windows per funzionare a livello globale sul tuo PC
Ad esempio popup Line 1\nLine 2
produrrà una finestra pop-up a 2 righe (digitare popup /?
per l'uso)
Ecco il codice
<!-- : 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>
deve solo pop-up quando si è all'interno di un VM, quindi tecnicamente dovrebbe esserci un codice come:
if %machine_type% == virtual_machine then
echo message box code
else
continue normal installation code