173 votes

Afficher une fenêtre contextuelle/une boîte de message à partir d'un fichier batch Windows

Existe-t-il un moyen d'afficher une boîte de message à partir d'un fichier batch (similaire à la manière dont les xmessage peut être utilisé à partir de scripts de base sous Linux) ?

0 votes

CMD.EXE, c'est un processeur de commande 32 bits qui prend en charge les commandes DOS.

7 votes

Il s'agit de l'Invite de commande Windows.

33voto

npocmaka Points 7794

Quelques autres moyens.

1) Le plus geek et le plus bricolé - il utilise l'IEXPRESS pour créer de petits exe qui vont créer une pop-up avec un seul bouton ( il peut créer deux autres types de messages pop-up ). Fonctionne sur TOUS les Windows à partir 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 de MSHTA . Fonctionne également sur toutes les machines Windows à partir de XP et plus (malgré le fait que le PO ne veut pas de langues "externes", le JavaScript est ici minimisé). Doit être sauvegardé comme .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 seule 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 le paramétrage .bat/jscript hybride (devrait être enregistré comme bat ). Il utilise à nouveau JavaScript, malgré la demande du PO, mais comme il s'agit d'une bat, il peut être appelé comme un fichier bat sans problème. Il utilise POPUP 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 (devrait être enregistré comme .bat ) Cette fois, il utilise .NET et compile un petit .exe 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 une pop-up (peut être appelé depuis la ligne de commande ou depuis le 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 du dbenham's vu aquí

start "" cmd /c "echo(&echo(&echo              Hello world!     &echo(&pause>nul"

7 ) Pour les notifications dans la barre d'état système, vous pouvez essayer este :

call SystemTrayNotification.bat  -tooltip warning -time 3000 -title "Woow" -text "Boom" -icon question

0 votes

Quel est le but de @if (true == false) @end dans votre premier exemple sous #2 ?

0 votes

@DanHenderson en lot il sera silencieux si condition en raison de la @ . Pour jscript, ce sera la directive @if -. documentation.help/MS-Office-JScript/jsstmconditionalif.htm . Il est utilisé pour activer silencieusement les commentaires jscript.

30voto

dc1 Points 131

De cette façon, votre fichier batch créera un script VBS et affichera une popup. Après son exécution, le fichier batch 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

23voto

User5910 Points 23

Voici une variante PowerShell qui ne nécessite pas le chargement des assemblages avant la création de la fenêtre, mais qui est nettement plus lente (~+50%) que la commande PowerShell MessageBox posté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 inférieure pour afficher les icônes dans le dialogue (voir Méthode Popup pour plus de détails) :

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

Adapté de l'article de Microsoft TechNet PowerTip : Utiliser PowerShell pour afficher une fenêtre pop-up .

1 votes

Le deuxième paramètre est nSecondsToWait Facultatif. Valeur numérique indiquant le nombre maximal de secondes pendant lesquelles vous souhaitez que la boîte de message contextuelle s'affiche. Si nSecondsToWait est égal à zéro (valeur par défaut), la boîte de message contextuelle reste visible jusqu'à ce que l'utilisateur la ferme. learn.microsoft.com/fr/us/previous-versions/Windows/

11voto

p2013 Points 32
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 '+') & 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 parmi 16, 32, 48, 64 au lieu de 16 (après le symbole '+') & voici la signification de chaque nombre :

16 – Critical Icon  
32 – Warning Icon  
48 – Warning Message Icon   
64 – Information Icon

3 votes

Comment obtenez-vous une réponse du script de VB ?

8voto

Max Runacres Points 59

Msg * "insérez votre message ici"

fonctionne bien, il suffit de l'enregistrer comme un fichier .bat dans le bloc-notes ou de s'assurer que le format est réglé sur "tous les fichiers".

1 votes

La documentation indique que "*" enverra le message à toutes les sessions du serveur spécifié, c'est-à-dire qu'il ne fonctionnera pas avec les services de terminal ou les changements rapides d'utilisateur.

2 votes

Vous pourriez utiliser msg %SESSIONNAME% msg

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X