Comment créer des messages pop up dans un script batch?

j'ai besoin de savoir comment faire des messages popup dans des scripts batch sans en utilisant VBScript ou KiXtart ou tout autre langage de programmation / script externe. Je n'ai aucune idée à ce sujet... avait pas de point de départ même. Je suis au courant de NET SEND, mais le service est désactivé dans mon environnement actuel.

27
demandé sur Cristian Ciupitu 2012-09-20 18:10:38

10 réponses

en ce qui concerne la réponse de LittleBobbyTable - NET SEND ne fonctionne pas sur Vista ou Windows 7. Il a été remplacé par le MSG.EXE

il existe une solution rudimentaire qui fonctionne sur toutes les versions de Windows - un message popup rudimentaire peut être envoyé en démarrant un nouveau cmd.exe fenêtre qui se ferme une fois qu'une touche est enfoncée.

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

si vous voulez que votre script s'arrête jusqu'à ce que la boîte de message soit rejetée, alors vous pouvez ajouter l'option /WAIT.

start "" /wait cmd /c "echo Hello world!&echo(&pause"
29
répondu dbenham 2015-12-03 13:18:01
msg * "Enter Your Message"

Est-ce que cela aide ?

41
répondu shredder 2013-08-15 08:51:23

vous pouvez profiter de CSCRIPT.EXE ou WSCRIPT.EXE (qui sont présents dans toutes les versions de Windows depuis, je crois, Windows 95) comme ceci:

echo msgbox "Hey! Here is a message!" > %tmp%\tmp.vbs
cscript /nologo %tmp%\tmp.vbs
del %tmp%\tmp.vbs

ou

echo msgbox "Hey! Here is a message!" > %tmp%\tmp.vbs
wscript %tmp%\tmp.vbs
del %tmp%\tmp.vbs

vous pouvez aussi choisir le plus personnalisable PopUp la commande. Cet exemple vous donne une fenêtre de 10 secondes pour cliquer OK, avant de chronométrer:

echo set WshShell = WScript.CreateObject("WScript.Shell") > %tmp%\tmp.vbs
echo WScript.Quit (WshShell.Popup( "You have 10 seconds to Click 'OK'." ,10 ,"Click OK", 0)) >> %tmp%\tmp.vbs
cscript /nologo %tmp%\tmp.vbs
if %errorlevel%==1 (
  echo You Clicked OK
) else (
  echo The Message timed out.
)
del %tmp%\tmp.vbs

dans leur contexte ci-dessus, les deux cscript et wscript agiront de même. Lorsqu'il est appelé à partir d'un fichier batch, bot cscript et wscript va mettre en pause le fichier batch jusqu'à ce qu'ils terminent leur script, puis permettre au fichier de continuer.

Lorsqu'il est appelé manuellement à partir de l'invite de commande, cscript ne renvoie pas de contrôle à l'invite de commande jusqu'à ce qu'il est fini, tandis que wscript va créer un thread seprate pour l'exécution de son script, retournant le contrôle à l'invite de commande avant même que son script ne soit terminé.

les autres méthodes discutées dans ce thread ne causent pas l'exécution de fichiers par lots pour faire une pause en attendant que le message soit cliqué. Votre choix sera dicté par vos besoins.

Remarque: grâce à cette méthode, des configurations à boutons et icônes multiples sont disponibles pour couvrir divers oui/non/annuler/abandonner/réessayer les requêtes de l'utilisateur: https://technet.microsoft.com/en-us/library/ee156593.aspx

enter image description here

19
répondu James K 2018-04-17 05:47:27

quelques autres façons (dans chacune d'elles le script attend pour appuyer sur le bouton contrairement à msg.exe).

1) Le geekiest et hackiest - il utilise le IEXPRESS de créer de petites exe qui permettra de créer un 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 au-dessus:

;@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) en utilisant MSHTA. Fonctionne également sur toutes les machines windows à partir de XP et au-dessus (malgré Yhe OP ne veut "externe" langues de la jsvascript ici est réduite).Devrait être sauvé 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 paramétrisé .bat/jscript hybride (devrait être sauvegardé sous bat).Il utilise à nouveau jscript malgré la requête OP 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 plus de populae 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="timedout";
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 jscript.net/.bat hybride (devrait être sauvegardé sous .bat).Cette fois, il utilise .NET et compile un petit .exe le 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 une pop-up (peut être appelé à partir de la ligne de commande ou de la fournée si powershell est installé):

powershell [Reflection.Assembly]::LoadWithPartialName("""System.Windows.Forms""");[Windows.Forms.MessageBox]::show("""Hello World""", """My PopUp Message Box""")

6) bien que msg la solution est déjà en poste la réponse ici est une meilleure façon de être utilisés:

msg * /self /w "hello world"

/self est un commutateur non documenté qui forcera msg à envoyer le message uniquement à l'utilisateur courant.

16
répondu npocmaka 2017-08-23 14:38:37

msg * Bonjour tout le monde

fonctionne pour moi..

4
répondu user3176371 2014-01-09 06:57:21

Votre meilleur pari est d'utiliser NET SEND tel que documenté sur le site de Rob van der Woude.

Sinon, vous aurez besoin d'utiliser un script externe du programme. Les fichiers Batch sont vraiment destinés à envoyer des messages via ECHO.

0
répondu LittleBobbyTables 2012-09-20 14:46:11

C'est très simple, car j'ai créé quelques lignes de code qui va le faire pour vous

donc définissez une variable comme msg et puis utilisez ce code. il apparaît dans une boîte de message VBS.

CODE:

@echo off
echo %msg% >vbs.txt
copy vbs.txt vbs.vbs
del vbs.txt
start vbs.vbs
timeout /t 1
del vbs.vbs
cls

C'est juste quelque chose que je suis venu avec elle devrait fonctionner pour la plupart de vos besoins de message et il fonctionne aussi avec des espaces contrairement à certains scripts de fournée

0
répondu user3674709 2014-06-12 01:33:48

il est facile de faire un message, voici comment:

premier notpad ouvert et tapez:

msg "Message",0,"Title"

et l'enregistrer en tant que Message.vbs.

Message.vbs %*
0
répondu Lord C 2014-10-11 18:27:22

msg * message goes here

cette méthode est très simple et facile et devrait fonctionner dans n'importe quel fichier batch que je crois. Le seul "inconvénient" de cette méthode est qu'elle ne peut afficher qu'un seul message à la fois, s'il y a plus d'un message, il s'affichera l'un après l'autre en fonction de l'ordre dans lequel vous les mettez à l'intérieur du code. Assurez-vous également qu'il y a un opérateur de boucle ou continu différent dans votre fichier batch ou il se fermera automatiquement et seul ce message apparaîtra. Si vous avez besoin d'un "calme" fond en boucle opperator, heres une:

pause >nul

cela devrait le maintenir en marche mais ensuite il se fermera après qu'un bouton est appuyé.

aussi pour garder toutes les commandes "silencieuses" lors de l'exécution, de sorte qu'ils courent et n'affichent pas qu'ils ont été tapés dans le fichier, il suffit de mettre la ligne suivante au début du fichier batch:

@echo off

j'espère que tous ces conseils ont aidé!

0
répondu Cubit-Games 2015-03-19 12:30:12
@echo off
title message

echo what's the password?
set/p "pass=>"

if not %pass% == password goto fail
msg *correct: Correct password!!!
goto end

:fail
msg *wrong: Wrong password!!!

:end
0
répondu Ruan 2017-09-19 20:44:31