Existe-t-il un moyen d'afficher une boîte de message à partir d'un fichier de commandes (similaire à la façon dont xmessage
peut être utilisé à partir de bash-scripts sous Linux)?
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 est 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 en ligne de commande Windows (encore une fois: pas de DOS, Windows pur, mais pas une fenêtre, mais une console).
Vous pouvez utiliser la méthode VBScript fournie par boflynn ou vous pouvez mal utiliser net send
ou msg
. net send
ne fonctionne que sur les anciennes versions de Windows:
net send localhost Some message to display
Cela dépend aussi du service Messenger à exécuter, cependant.
Pour les versions plus récentes (XP et ultérieur, apparemment):
msg "%username%" Some message to display
Il est à noter qu'une boîte de message envoyée à l'aide de msg.exe
ne durera que 60 secondes. Cela peut toutefois être annulé avec le commutateur /time:xx
.
Peut afficher un peu de flash, mais aucun fichier temporaire n'est requis. Devrait fonctionner jusqu’à l’époque de l’ère IE5 (IIRC).
mshta javascript:alert("Message\n\nMultiple\nLines\ntoo!");close();
N'oubliez pas de échappez vos parenthèses si vous utilisez if
:
if 1 == 1 (
mshta javascript:alert^("1 is equal to 1, amazing."^);close^(^);
)
Cela fera apparaître une autre fenêtre d'invite de commande:
START CMD /C "ECHO My Popup Message && PAUSE"
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 dans lequel command.com va rechercher les fichiers, puis sur la ligne suivante:
"insert name of your vbscript here".vbs
Ensuite, vous créez un nouveau Notepad document, tapez
<script type="text/vbscript">
MsgBox "your text here"
</script>
Vous voudriez alors sauvegarder ceci en tant que fichier .vbs (en mettant ".vbs" à la fin du nom du fichier), enregistrez en tant que "Tous les fichiers" dans la liste déroulante située sous le nom du fichier (afin de ne pas l'enregistrer au format .txt). ), puis cliquez sur Enregistrer!
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
Peu plus de moyens.
1) Le plus geek et le plus hacki - il utilise IEXPRESS pour créer un petit fichier exe qui créera une fenêtre contextuelle avec un seul bouton ( il peut créer deux autres types de messages contextuels ). Fonctionne sur TOUTES les fenêtres à partir de XP et versions ultérieures:
;@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 de MSHTA
. Fonctionne également sur toutes les machines Windows à partir de XP et versions ultérieures (même si le PO ne veut pas de langages "externes", le JavaScript est ici minimisé). Devrait être enregistré comme .bat
:
@if (true == false) @end /*!
@echo off
mshta "about:<script src='file://%~f0'></script><script>close()</script>" %*
goto :EOF */
alert("Hello, world!");
ou sur 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 .bat/jscript
hybride paramétré (doit être enregistré sous le nom bat
). Il utilise à nouveau JavaScript malgré la demande OP, mais comme il s'agit d'une batte, il peut être appelé comme un fichier bat sans soucis. Il utilise POPUP ce qui permet un peu plus de contrôle que le plus populaire MSGBOX . 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 le nom .bat
). Cette fois, il utilise .NET
et compile un petit fichier .exe
pouvant ê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 une fenêtre contextuelle (peut être appelé à partir de la ligne de commande ou de 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
Voici une variante de PowerShell qui n'exige pas de charger les assemblys avant de créer la fenêtre, mais elle s'exécute sensiblement 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 modifier le dernier paramètre de "0x0" en une valeur ci-dessous pour afficher les icônes dans la boîte de dialogue (voir Méthode Popup pour plus de détails):
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 une fenêtre contextuelle .
echo X=MsgBox("Message Description",0+16,"Title") >msg.vbs
–Vous pouvez écrire des nombres 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 des nombres compris entre 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-le sous forme de fichier .bat dans le bloc-notes ou assurez-vous que le format est défini sur "tous les fichiers"
Pour ce faire, vous devez disposer d'un petit programme qui affiche une boîte de message et l'exécute à partir de votre fichier de commandes.
Vous pouvez toutefois ouvrir une fenêtre de console affichant une invite, mais obtenir une boîte de message d'interface graphique utilisant uniquement cmd.exe et ses amis n'est pas possible, autant que je sache.
msg * /time:0 /w Hello everybody!
Ce message attend indéfiniment que vous cliquez sur OK (il ne dure qu'une minute par défaut) et fonctionne correctement sous Windows 8.1.
Suite à la réponse de @ Fowl, vous pouvez l’améliorer avec un délai d’affichage qui ne doit 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.
J'utilise un utilitaire nommé msgbox.exe à partir d'ici: http://www.paulsadowski.com/WSH/cmdprogs.htm
Vous pouvez appeler la fonction dll de user32.dll, je pense que quelque chose comme
Rundll32.exe user32.dll, MessageBox (0, "text", "titleText", {indicateurs supplémentaires pour la boîte de message la plus proche, e.t.c})
En le tapant depuis mon téléphone, ne me jugez pas ... sinon, je lierais les drapeaux supplémentaires.
Ceci application peut le faire, si vous convertissez (enveloppez) vos fichiers de commandes en fichiers exécutables.
Messagebox simple
%extd% /messagebox Title Text
MessageBox d'erreur
%extd% /messagebox Error "Error message" 16
Annuler Nouvelle tentative Messagebox
%extd% /messagebox Title "Try again or Cancel" 5
4) "Ne plus me demander" Messagebox
%extd% /messageboxcheck Title Message 0 {73E8105A-7AD2-4335-B694-94F837A38E79}
msg * /server:127.0.0.1 Tapez votre message ici
ne meilleure option
set my_message=Hello world
_&& start cmd /c "@echo off & mode con cols=15 lines=2 & echo %my_message% & pause>nul"
_
La description:
_lines=
_ nombre de lignes, plus 1
_cols=
_ nombre de caractères dans le message, plus 3 (Toutefois, le minimum doit être de _15
_)
cols
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"