web-dev-qa-db-fra.com

Comment créer des messages contextuels dans un script batch?

J'ai besoin de savoir comment créer des messages contextuels dans des scripts batch sans avec VBScript, KiXtart ou tout autre langage de programmation/script externe . Je suis conscient de NET SEND mais le service Messenger est désactivé dans mon environnement actuel.

30
Gutsygibbon

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

Il existe une solution brute qui fonctionne sur toutes les versions de Windows - Un message contextuel brut peut être envoyé en DÉMARRANT une nouvelle fenêtre cmd.exe qui se ferme lorsque vous appuyez sur une touche.

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

Si vous souhaitez que votre script suspende jusqu'à ce que la boîte de message soit fermée, vous pouvez ajouter l'option/WAIT.

start "" /wait cmd /c "echo Hello world!&echo(&pause"
30
dbenham
msg * "Enter Your Message"

Est-ce que cela aide ?

42
shredder

Vous pouvez tirer parti de CSCRIPT.EXE ou WSCRIPT.EXE (présent 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 également choisir la commande PopUp, plus personnalisable. Cet exemple vous donne une fenêtre de 10 secondes pour cliquer sur OK, avant la fin du délai imparti:

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, cscript et wscript agiront de la même manière. Lorsqu’il est appelé à partir d’un fichier de commandes, bot cscript et wscript met en pause le fichier de commandes jusqu’à ce qu’ils aient terminé leur script, puis permettent au fichier de continuer.

Lorsqu’il est appelé manuellement à partir de la commande Invite, cscript ne rendra pas le contrôle à la commande Invite tant qu’elle ne sera pas terminée, tandis que wscript créera un thread distinct pour l’exécution de son script, rendant le contrôle à la commande Invite même avant la fin de son script.

D'autres méthodes présentées dans ce fil de discussion n'entraînent pas de pause dans l'exécution des fichiers de commandes pendant l'attente du clic sur le message. Votre choix sera dicté par vos besoins.

Remarque: À l'aide de cette méthode, plusieurs configurations de boutons et d'icônes sont disponibles pour couvrir diverses requêtes oui/non/annuler/annuler/réessayer à l'utilisateur: https://technet.Microsoft.com/ en-us/library/ee156593.aspx

 enter image description here

19
James K

Peu plus de façons (dans chacune d’elles, le script attend que l’on appuie sur un bouton contrairement à msg.exe).

1) Le plus geekiest et hackiest - il utilise l'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 ). CHAQUE fenêtre à partir de XP et des versions supé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 l'OP ne veut pas de langages "externes", le jsvascript est ici minimisé). Devrait être enregistré sous le nom .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 le .bat/jscript hybride paramétré (doit être enregistré sous le nom bat). Il utilise à nouveau le jScript malgré la requête OP, mais comme il s'agit d'une batte, il peut être appelé en tant que fichier bat sans soucis. 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 un hybride jscript.net/.bat (devrait ê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) Bien que la solution msg soit déjà publiée en tant que réponse, voici une meilleure façon de l'utiliser:

msg * /self /w "hello world"

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

16
npocmaka

msg * Bonjour tout le monde

travaille pour moi..

4
user3176371

Il est facile de faire un message, voici comment:

Premier bloc-notes ouvert et tapez:

msg "Message",0,"Title"

et enregistrez-le en tant que Message.vbs.

Maintenant, dans votre type de fichier batch:

Message.vbs %*
0
Lord C
@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
Ruan

msg * message goes here

Cette méthode est très simple et facile et devrait fonctionner dans n'importe quel fichier batch, je crois. Le seul inconvénient de cette méthode est qu’elle ne peut afficher qu’un seul message à la fois; s’il ya plus d’un message, elle s'affichera l’une après l’autre, en fonction de l’ordre dans lequel vous les placez dans le code. Assurez-vous également qu'il y a un autre opérateur en boucle ou en continu dans votre fichier de commandes, sinon il se fermera automatiquement et seul ce message s'affichera. Si vous avez besoin d’un opérateur de boucle d’arrière-plan "silencieux", voici un exemple:

pause >nul

Cela devrait continuer à fonctionner mais il se fermera après l’appui d’un bouton.

Aussi, pour que toutes les commandes soient "silencieuses" lors de l'exécution, afin qu'elles s'exécutent sans indiquer qu'elles ont été saisies dans le fichier, il suffit de mettre la ligne suivante au début du fichier de commandes:

@echo off

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

0
Cubit-Games

Votre meilleur choix est d'utiliser NET SEND comme indiqué sur Le site de Rob van der Woude

Sinon, vous devrez utiliser un programme de script externe. Les fichiers de commandes sont vraiment destinés à envoyer des messages via ECHO.

0
LittleBobbyTables

C'est très simple parce que j'ai créé quelques lignes de code qui le feront pour vous.

Définissez donc une variable en tant que msg, 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 j’ai trouvé qui devrait fonctionner pour la plupart de vos besoins en matière de messagerie et qui fonctionne aussi avec des espaces contrairement à certains scripts batch.

0
user3674709