Mostra un popup/finestra di messaggio da un file batch Windows
-
13-09-2019 - |
Domanda
C'è un modo per visualizzare una finestra di messaggio da un file batch (simile a come xmessage
può essere utilizzato da bash-script in Linux)?
Soluzione
Vorrei fare un file VBScript molto semplice e chiamarlo usando CScript per analizzare i parametri della riga di comando.
qualcosa come il seguente salvati nella MessageBox.vbs
:
Set objArgs = WScript.Arguments
messageText = objArgs(0)
MsgBox messageText
Il che si sarebbe chiamata come:
cscript MessageBox.vbs "This will be shown in a popup."
MsgBox
riferimento se sono interessati ad andare questo itinerario.
Altri suggerimenti
Prima di tutto, DOS non ha nulla a che fare con essa, probabilmente si desidera una soluzione a riga di comando di Windows. (Di nuovo: no DOS, puro di Windows, non solo una finestra, ma una console)
È possibile utilizzare il metodo VBScript fornito da boflynn o è possibile uso improprio o net send
msg
. net send
funziona solo su versioni precedenti di Windows:
net send localhost Some message to display
Questo dipende anche il servizio Messenger per eseguire, però.
Per le versioni più recenti (XP e poi, a quanto pare):
msg "%username%" Some message to display
Si deve notare che una finestra di messaggio inviato utilizzando msg.exe
durerà solo per 60 secondi. Questo può tuttavia essere sovrascritta con l'opzione /time:xx
.
potrebbe visualizzare un piccolo lampo, ma nessun file temporanei necessari. Dovrebbe funzionare per tutto il tragitto da qualche parte in epoca (IIRC) IE5.
mshta javascript:alert("Message\n\nMultiple\nLines\ntoo!");close();
Non dimenticare di sfuggire al tuo parentesi se' Re utilizzando if
:
if 1 == 1 (
mshta javascript:alert^("1 is equal to 1, amazing."^);close^(^);
)
Questo pop-up un'altra finestra Prompt dei comandi:
START CMD /C "ECHO My Popup Message && PAUSE"
Prova:
Msg * "insert your message here"
Se si utilizza command.com di Windows XP, si aprirà una finestra di messaggio.
Apertura di una nuova finestra cmd non è proprio quello che chiediamo è, mi sembra di capire. Si potrebbe anche usare VBScript , e utilizzare questo con il file .bat. Si potrebbe aprirlo dal file bat con questo comando:
cd C:\"location of vbscript"
Quello che fa è cambiare la directory command.com cercherà i file da, quindi alla riga successiva:
"insert name of your vbscript here".vbs
Poi si crea una nuova Notepad documento, digitare
<script type="text/vbscript">
MsgBox "your text here"
</script>
Si potrebbe quindi salvare questo come un file vbs (mettendo ".vbs" alla fine del nome del file), salva come 'Tutti i file' nella goccia casella sotto il nome del file verso il basso (in modo che non salva come txt), quindi fare clic su Salva!
In questo modo il file batch creerà uno script VBS e mostrare un popup. Dopo viene eseguito, il file batch cancellerà quel file intermedio.
Il vantaggio di utilizzare MSGBOX è che è davvero customaziable (cambiare il titolo, l'icona, ecc), mentre MSG.EXE non è tanto.
echo MSGBOX "YOUR MESSAGE" > %temp%\TEMPmessage.vbs
call %temp%\TEMPmessage.vbs
del %temp%\TEMPmessage.vbs /f /q
Pochi altri modi.
1) Il geekiest e hackiest - utilizza l'IEXPRESS per creare piccole exe che creerà un pop-up con un solo tasto ( si può creare più di due tipi di messaggi pop-up ). Funziona su ogni Windows da XP e sopra:
;@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
Utilizzando. Funziona anche su ogni macchina Windows da XP e versioni successive (nonostante il PO non vogliono lingue "esterne" è ridotto al minimo il JavaScript qui). Deve 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 sola 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 parametrizzato .bat/jscript
ibrido (deve essere salvato come bat
). Esso utilizza di nuovo JavaScript, nonostante la richiesta di OP, ma in quanto è un pipistrello può essere chiamato come un file bat senza preoccupazioni. Esso utilizza POPUP che permette un po ' po 'più di controllo rispetto alla . Esso utilizza WSH, ma non MSHTA come nell'esempio qui 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 un sistema ibrido jscript.net/.bat
(deve essere salvato come .bat
) .Questo tempo utilizza .NET
e compila un piccolo file .exe
che potrebbe essere cancellato:
@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 da riga di comando o da lotto se è installato PowerShell):
powershell [Reflection.Assembly]::LoadWithPartialName("""System.Windows.Forms""");[Windows.Forms.MessageBox]::show("""Hello World""", """My PopUp Message Box""")
6) e l'approccio visto del dbenham qui
start "" cmd /c "echo(&echo(&echo Hello world! &echo(&pause>nul"
7 ) per un sistema di notifiche della barra si possono provare questo :
call SystemTrayNotification.bat -tooltip warning -time 3000 -title "Woow" -text "Boom" -icon question
Ecco una PowerShell variante che non richiedono il caricamento di assemblee prima di creare la finestra, però funziona notevolmente più lenta (~+50%) rispetto a PowerShell MessageBox comando postato qui da @npocmaka:
powershell (New-Object -ComObject Wscript.Shell).Popup("""Operation Completed""",0,"""Done""",0x0)
È possibile modificare l'ultimo parametro da "0x0" per un valore inferiore a visualizzare le icone nella finestra di dialogo (vedi Popup Metodo Di per ulteriori riferimenti):
0x10 Stop
0x20 punto Interrogativo
0x30 punto Esclamativo
0x40 Informazioni Marco
Adattato dall'articolo della Microsoft TechNet PowerTip:Utilizzare PowerShell per Visualizzare la Finestra Pop-Up.
echo X=MsgBox("Message Description",0+16,"Title") >msg.vbs
-si può scrivere qualsiasi numero da 0,1,2,3,4, invece di 0 (prima del simbolo ‘+’) e qui è il significato di ogni numero:
0 = Ok Button
1 = Ok/Cancel Button
2 = Abort/Retry/Ignore button
3 = Yes/No/Cancel
4 = Yes/No
-si può scrivere qualsiasi numeri 16,32,48,64 invece di 16 (dopo il simbolo ‘+’) e qui è il significato di ogni numero:
16 – Critical Icon
32 – Warning Icon
48 – Warning Message Icon
64 – Information Icon
Msg * "inserire qui il tuo messaggio"
funziona bene, solo salvare come file .bat in notepad o assicurarsi che il formato è impostato su "tutti i file"
Per fare questo, è necessario disporre di un piccolo programma che visualizza una messagebox ed eseguire che dal file batch.
Si potrebbe aprire una finestra di console che visualizza un prompt, però, ma ottenendo una finestra di messaggio GUI utilizzando cmd.exe e gli amici solo non è possibile, per quanto ne so.
Io uso un programma di utilità di nome msgbox.exe da qui: http://www.paulsadowski.com/WSH/cmdprogs.htm
msg * /time:0 /w Hello everybody!
Questo messaggio aspetta sempre fino a quando si fa clic su OK (dura un solo minuto per impostazione predefinita) e funziona bene in Windows 8.1
A seguito @ risposta di Fowl, si può migliorare con un timeout per apparire solo per 10 secondi utilizzando il seguente:
mshta "javascript:var sh=new ActiveXObject( 'WScript.Shell' ); sh.Popup( 'Message!', 10, 'Title!', 64 );close()"
qui per ulteriori dettagli.
È possibile richiamare la funzione DLL da user32.dll penso Qualcosa di simile
Rundll32.exe user32.dll, MessageBox (0, "testo", "TitleText", {bandiere in più per come più in alto MessageBox e.t.c})
Digitando dal mio telefono, non giudicarmi ... altrimenti avrei collegare i flag extra.
* msg /server:127.0.0.1 Scrivi il tuo messaggio qui
Questa applicazione href="http://www.f2ko.de/en/b2e.php" rel="nofollow"> possono farlo, se si converte (avvolgere) i vostri file batch in file eseguibili
.
-
Messagebox semplice
%extd% /messagebox Title Text
-
Errore Messagebox
%extd% /messagebox Error "Error message" 16
-
Annulla Riprova Messagebox
%extd% /messagebox Title "Try again or Cancel" 5
4) "Mai mi chiedere di nuovo" Messagebox
%extd% /messageboxcheck Title Message 0 {73E8105A-7AD2-4335-B694-94F837A38E79}
Una soluzione migliore
set my_message=Hello world
&& start cmd /c "@echo off & mode con cols=15 lines=2 & echo %my_message% & pause>nul"
Descrizione:
importo lines=
di linee, più 1
importo cols=
di caratteri nel messaggio, più 3 (Tuttavia, minima deve essere 15
)
Versione cols
Auto-calcolata:
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"
ha solo bisogno di popup quando all'interno di una macchina virtuale, quindi tecnicamente, ci dovrebbe essere qualche codice come:
if %machine_type% == virtual_machine then
echo message box code
else
continue normal installation code