Existe-t-il un moyen d'afficher une boîte de message à partir d'un fichier batch (similaire à la façon dont xmessage
peut être utilisé à partir de scripts bash sous Linux)?
Existe-t-il un moyen d'afficher une boîte de message à partir d'un fichier batch (similaire à la façon dont xmessage
peut être utilisé à partir de scripts bash sous Linux)?
Réponses:
Je créerais un fichier VBScript très simple et l'appellerais en utilisant CScript pour analyser les paramètres de ligne de commande.
Quelque chose comme ce qui suit enregistré dans MessageBox.vbs
:
Set objArgs = WScript.Arguments
messageText = objArgs(0)
MsgBox messageText
Ce que vous appelleriez comme:
cscript MessageBox.vbs "This will be shown in a popup."
MsgBox
référence si vous êtes intéressé par cette voie.
Tout d'abord, DOS n'a rien à voir avec cela, vous voulez probablement une solution de ligne de commande Windows (encore une fois: pas de DOS, Windows pur, mais pas une fenêtre, mais une console).
Vous pouvez soit utiliser la méthode VBScript fournie par boflynn, soit mal utiliser net send
ou msg
. net send
fonctionne uniquement sur les anciennes versions de Windows:
net send localhost Some message to display
Cela dépend également du service Messenger à exécuter.
Pour les versions plus récentes (XP et versions ultérieures, apparemment):
msg "%username%" Some message to display
Il est à noter qu'une boîte de message envoyée en utilisant msg.exe
ne durera que 60 secondes. Cela peut cependant être annulé avec le /time:xx
commutateur.
Peut afficher un peu de flash, mais aucun fichier temporaire n'est requis. Devrait fonctionner jusqu'à quelque part dans l'ère (IIRC) IE5.
mshta javascript:alert("Message\n\nMultiple\nLines\ntoo!");close();
N'oubliez pas d' échapper vos parenthèses si vous utilisez if
:
if 1 == 1 (
mshta javascript:alert^("1 is equal to 1, amazing."^);close^(^);
)
close() was unexpected at this time
.
^
caractères d'échappement dans un fichier chauve-souris
Cela fera apparaître une autre fenêtre d'invite de commandes:
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"
remplacez le cols=18
par le nombre de caractères dans le message + 2. Et le lines=2
à quel que soit le nombre de lignes est + 1.
cmd /k
Essayez:
Msg * "insert your message here"
Si vous utilisez command.com de Windows XP, cela ouvrira une boîte de message.
Ouvrir une nouvelle fenêtre cmd n'est pas tout à fait ce que vous demandiez, je suppose. Vous pouvez également utiliser VBScript et l'utiliser avec votre fichier .bat. Vous l'ouvririez à partir du fichier bat avec cette commande:
cd C:\"location of vbscript"
Cela change le répertoire command.com recherchera les fichiers à partir de, puis sur la ligne suivante:
"insert name of your vbscript here".vbs
Ensuite, vous créez un nouveau document Bloc-notes , tapez
<script type="text/vbscript">
MsgBox "your text here"
</script>
Vous enregistrez ensuite ceci en tant que fichier .vbs (en mettant «.vbs» à la fin du nom de fichier), enregistrez-le sous «Tous les fichiers» dans la liste déroulante sous le nom du fichier (il ne sera donc pas enregistré sous .txt ), puis cliquez sur Enregistrer!
<script/>
étiquette.
msg *
vous serez invité à entrer un message suivi de ctrl-Z. Vous pouvez saisir ici des sauts de ligne qui apparaîtront dans votre message.
Quelques autres moyens.
1) Le plus geek et le plus piraté - il utilise IEXPRESS pour créer un petit exe qui créera un pop-up avec un seul bouton ( il peut créer deux autres types de messages pop-up ). Fonctionne sur TOUTES les fenêtres de XP et plus:
;@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) Utilisation MSHTA
. Fonctionne également sur toutes les machines Windows à partir de XP et plus (malgré le fait que l'OP ne veut pas de langues "externes", le JavaScript est ici minimisé). Doit être enregistré sous .bat
:
@if (true == false) @end /*!
@echo off
mshta "about:<script src='file://%~f0'></script><script>close()</script>" %*
goto :EOF */
alert("Hello, world!");
ou en une ligne:
mshta "about:<script>alert('Hello, world!');close()</script>"
ou
mshta "javascript:alert('message');close()"
ou
mshta.exe vbscript:Execute("msgbox ""message"",0,""title"":close")
3) Voici l' .bat/jscript
hybride paramétré (doit être enregistré sous bat
). Il utilise à nouveau JavaScript malgré la requête OP, mais comme il s'agit d'une batte, elle peut être appelée comme un fichier bat sans soucis. Il utilise POPUP qui permet un peu plus de contrôle que le MSGBOX plus populaire . Il utilise WSH, mais pas MSHTA comme dans l'exemple ci-dessus.
@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) et un jscript.net/.bat
hybride (doit être enregistré sous .bat
) .Cette fois, il utilise .NET
et compile un petit .exe
fichier qui pourrait être supprimé:
@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) et à la fin un seul appel à PowerShell qui crée un pop-up (peut être appelé à partir de la ligne de commande ou du batch si PowerShell est installé):
powershell [Reflection.Assembly]::LoadWithPartialName("""System.Windows.Forms""");[Windows.Forms.MessageBox]::show("""Hello World""", """My PopUp Message Box""")
6) Et l'approche de dbenham vue ici
start "" cmd /c "echo(&echo(&echo Hello world! &echo(&pause>nul"
7 ) Pour les notifications de la barre d'état système, vous pouvez essayer ceci :
call SystemTrayNotification.bat -tooltip warning -time 3000 -title "Woow" -text "Boom" -icon question
De cette façon, votre fichier de commandes créera un script VBS et affichera une fenêtre contextuelle. Après son exécution, le fichier de commandes supprimera ce fichier intermédiaire.
L'avantage d'utiliser MSGBOX est qu'il est vraiment personnalisable (changer le titre, l'icône, etc.) alors que MSG.exe ne l'est pas autant.
echo MSGBOX "YOUR MESSAGE" > %temp%\TEMPmessage.vbs
call %temp%\TEMPmessage.vbs
del %temp%\TEMPmessage.vbs /f /q
Voici une variante de PowerShell qui ne nécessite pas le chargement d'assemblys avant de créer la fenêtre, mais elle s'exécute nettement plus lentement (~ + 50%) que la commande PowerShell MessageBox publiée ici par @npocmaka:
powershell (New-Object -ComObject Wscript.Shell).Popup("""Operation Completed""",0,"""Done""",0x0)
Vous pouvez changer le dernier paramètre de "0x0" à une valeur ci-dessous pour afficher les icônes dans la boîte de dialogue (voir Méthode Popup pour plus d'informations):
0x10 Stop
0x20 Point d'interrogation
0x30 Point d'exclamation
0x40 Marque d'information
Adapté de l'article Microsoft TechNet PowerTip: utiliser PowerShell pour afficher la fenêtre contextuelle .
echo X=MsgBox("Message Description",0+16,"Title") >msg.vbs
–Vous pouvez écrire n'importe quel nombre de 0,1,2,3,4 au lieu de 0 (avant le symbole '+') et voici la signification de chaque nombre:
0 = Ok Button
1 = Ok/Cancel Button
2 = Abort/Retry/Ignore button
3 = Yes/No/Cancel
4 = Yes/No
–Vous pouvez écrire n'importe quel nombre de 16,32,48,64 au lieu de 16 (après le symbole «+») et voici la signification de chaque nombre:
16 – Critical Icon
32 – Warning Icon
48 – Warning Message Icon
64 – Information Icon
Msg * "insérez votre message ici"
fonctionne bien, enregistrez simplement en tant que fichier .bat dans le bloc-notes ou assurez-vous que le format est défini sur "tous les fichiers"
msg %SESSIONNAME% msg
msg * /time:0 /w Hello everybody!
Ce message attend indéfiniment jusqu'à ce que vous cliquiez sur OK (cela ne dure qu'une minute par défaut) et fonctionne correctement sous Windows 8.1
msg * /time:0 /w <C:\Somewhere\Message.txt
où dans le fichier se trouve du texte normal (contenant des CrLf).
Pour ce faire, vous devez avoir un petit programme qui affiche une boîte de message et l'exécute à partir de votre fichier de commandes.
Vous pouvez ouvrir une fenêtre de console qui affiche une invite, mais obtenir une boîte de message GUI en utilisant uniquement cmd.exe et amis n'est pas possible, AFAIK.
J'utilise un utilitaire nommé msgbox.exe à partir d'ici: http://www.paulsadowski.com/WSH/cmdprogs.htm
Suite à la réponse de @ Fowl, vous pouvez l'améliorer avec un délai d'attente pour n'apparaître que pendant 10 secondes en utilisant les éléments suivants:
mshta "javascript:var sh=new ActiveXObject( 'WScript.Shell' ); sh.Popup( 'Message!', 10, 'Title!', 64 );close()"
Voir ici pour plus de détails.
Vous pouvez appeler la fonction dll à partir de user32.dll je pense quelque chose comme
Rundll32.exe user32.dll, MessageBox (0, "text", "titleText", {indicateurs supplémentaires pour la boîte de message comme la plus haute, etc.})
En le tapant depuis mon téléphone, ne me jugez pas ... sinon je lierais les drapeaux supplémentaires.
rundll32.exe user32.dll,MessageBoxA X
afficher une boîte de message avec X comme titre lorsque je le fais dans la zone Exécuter. Peu importe ce que je fais de X, je ne peux pas le faire interpréter comme plusieurs paramètres - tout entre dans le titre. Donc, rundll32.exe user32.dll,MessageBoxA (0, "MyTitle", "MyText", 0)
affiche une boîte de message avec un titre de (0, "MyTitle", "MyText", 0)
Mais je ne peux pas le faire fonctionner DU TOUT à partir de la ligne de commande - uniquement à partir de la zone Exécuter. Sur la ligne de commande, cela ne fait rien du tout. Cela fonctionne-t-il à coup sûr à partir d'une ligne de commande ou d'un fichier de commandes ou uniquement à partir de la zone Exécuter?
msg * /server:127.0.0.1 Tapez votre message ici
where msg
retourne C:\Windows\System32\msg.exe
. Je pense que vous pensez ànet send
Cette application peut le faire si vous convertissez (enveloppez) vos fichiers batch en fichiers exécutables.
Boîte de message simple
%extd% /messagebox Title Text
Message d'erreur
%extd% /messagebox Error "Error message" 16
Annuler Réessayer Messagebox
%extd% /messagebox Title "Try again or Cancel" 5
4) Messagebox "Ne plus jamais me demander"
%extd% /messageboxcheck Title Message 0 {73E8105A-7AD2-4335-B694-94F837A38E79}
Une meilleure option
set my_message=Hello world
&& start cmd /c "@echo off & mode con cols=15 lines=2 & echo %my_message% & pause>nul"
Description:
lines=
nombre de lignes, plus 1
cols=
nombre de caractères dans le message, plus 3 (Cependant, le minimum doit être15
)
cols
Version calculée automatiquement :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"
). Le vôtre ne l'est pas. Il fait écho au message mais ne parvient pas à définir la taille de la fenêtre retournant The screen cannot be set to the number of lines and columns specified.
au moins dans mon Windows 7.
x
dans le répertoire courant ou que cela ne vous dérange pas de le perdre.
x
, votre commande échoue tout simplement. Ne me remerciez pas et corrigez simplement votre code. Vous n'avez même pas besoin d'utiliser une doublure. Et si vous pensez que votre code est si bon, veuillez le publier dans Code Review .
Voici mon script batch que j'ai mis en place sur la base des bonnes réponses ici et dans d'autres articles
Vous pouvez définir le délai d'expiration du titre et même mettre en veille pour le programmer pour ce dernier et \ n pour une nouvelle ligne
Nommez-le popup.bat et placez-le dans votre dossier de chemin Windows pour qu'il fonctionne globalement sur votre PC
Par exemple popup Line 1\nLine 2
produira une boîte contextuelle de 2 lignes (tapezpopup /?
pour l'utilisation)
Voici le code
<!-- : 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>
il doit SEULEMENT apparaître à l'intérieur d'une vm, donc techniquement, il devrait y avoir du code comme:
if %machine_type% == virtual_machine then
echo message box code
else
continue normal installation code