web-dev-qa-db-fra.com

Afficher une fenêtre contextuelle / un message à partir d'un fichier de commandes Windows

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)?

140
billyy

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.

112
boflynn

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.

121
Joey

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^(^);
)
83
Fowl

Cela fera apparaître une autre fenêtre d'invite de commande:

START CMD /C "ECHO My Popup Message && PAUSE"
70
Dave Webb

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!

33
Justsomen00b

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
27
dc1

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
26
npocmaka

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):

Stop 0x10 Stop
Question Mark 0x20 Point d'interrogation
Exclamation Mark 0x30 Point d'exclamation
Information Mark 0x40 Marque d'information

Adapté de l'article Microsoft TechNet PowerTip: utiliser PowerShell pour afficher une fenêtre contextuelle .

10
User5910
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  
10
p2013

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"

7
Max Runacres

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.

4
Macke
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.

3
MoE bis

Vous pouvez utiliser Zenity . Zenity permet l'exécution de boîtes de dialogue dans des scripts de ligne de commande et de shell. Plus d'informations peuvent également être trouvées sur Wikipedia .

C'est multi-plateforme: un installateur Windows pour Windows peut être trouvé ici .

3
parvus

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.

3
Rafi

J'utilise un utilitaire nommé msgbox.exe à partir d'ici: http://www.paulsadowski.com/WSH/cmdprogs.htm

3
zhongshu

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.

2
Entropy

Ceci application peut le faire, si vous convertissez (enveloppez) vos fichiers de commandes en fichiers exécutables.


  1. Messagebox simple

    %extd% /messagebox Title Text
    

  1. MessageBox d'erreur

    %extd% /messagebox  Error "Error message" 16
    
  2. 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}
1
someone23432

msg * /server:127.0.0.1 Tapez votre message ici

1
Franco

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_)

Version _ 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"

0
T.Todua