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

153

Existe-t-il un moyen d'afficher une boîte de message à partir d'un fichier batch (similaire à la façon dont xmessagepeut être utilisé à partir de scripts bash sous Linux)?

Billyy
la source
CMD.EXE, c'est un processeur de commandes 32 bits qui prend en charge les commandes DOS.
Alan B
7
Cela s'appelle l'invite de commande Windows.
Ricardo Polo Jaramillo

Réponses:

121

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 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."

MsgBoxréférence si vous êtes intéressé par cette voie.

boflynn
la source
merci qui le ferait, je vais créer un fichier, y écrire ces données, et que de l'utiliser, que de le supprimer. devrait fonctionner bien :)
billyy
1
Très bonne réponse. De cette façon, vous pouvez avoir un contrôle total sur les icônes, les boutons et le titre de la boîte. Aussi, lorsque vous enregistrez votre fichier quelque part le long de PATH, vous l'appelez depuis n'importe quel endroit. J'ai créé quelques fichiers pour les alertes avec différentes icônes.
Deus777
Agréable. BTW, vous n'avez pas besoin d'utiliser CScript, du moins dans Win10. Avec CScript, j'obtiens du texte supplémentaire dans l'invite de commande. Sans CScript, il n'y a que l'alerte, ce qui est génial
A Child of God
Je n'avais pas cscript. J'ai utilisé start à la place.
sureshvv
127

Tout d'abord, DOS n'a rien à voir avec cela, vous voulez probablement une solution de ligne de commande Windows (encore une fois: pas de DOS, Windows pur, mais pas une fenêtre, mais une console).

Vous pouvez soit utiliser la méthode VBScript fournie par boflynn, soit mal utiliser net sendou msg. net sendfonctionne uniquement sur les anciennes versions de Windows:

net send localhost Some message to display

Cela dépend également du service Messenger à exécuter.

Pour les versions plus récentes (XP et versions ultérieures, apparemment):

msg "%username%" Some message to display

Il est à noter qu'une boîte de message envoyée en utilisant msg.exene durera que 60 secondes. Cela peut cependant être annulé avec le /time:xxcommutateur.

Joey
la source
2
Vous pouvez utiliser des variables d'environnement pour obtenir l'utilisateur local -% USERNAME%. msg.exe est sur ma machine XP Home, mais j'ai entendu des récits anecdotiques selon lesquels ce n'est pas sur toutes les versions de Vista. Je pense que le service derrière NET SEND est désactivé ces jours-ci.
McDowell
Bien, merci, j'ai oublié l'envvar (utilisez rarement quelque chose au-delà de% UserProfile% et mes propres définis par lots :)). C'est drôle, cependant, vous avez raison sur le service Messenger. Il n'existe même pas sur ma VM XP, mais l'envoi net existe toujours. msg.exe y fonctionne cependant.
Joey
18
Je pensais qu'une option viable manquait dans les réponses et je l'ai fournie. Rien de mal ici. Vous n'avez pas non plus besoin de vous sentir obligé de faire quelque chose et je ne dis pas non plus que Boflynn a tort. J'ajoutais simplement une autre option qui devrait parfaitement convenir aux questions qui n'ont pas une seule réponse définitive. De plus, vous n'êtes probablement pas le seul à avoir cette question et d'autres peuvent ne pas vouloir utiliser VBScript pour quelque raison que ce soit. Ceci est un site communautaire, pas uniquement le vôtre :-)
Joey
8
Pour ma part, je viens de l'utiliser pour générer un message "Je t'aime" sur le PC de ma petite amie à partir d'un shell distant.
Camilo Martin
1
Sur Windows 8 et 10, j'ai trouvé la version de Windows qui compte. Pour moi ça marche sur pro mais pas chez moi. D'autres ont rapporté que cela fonctionne sur Home Premium et Enterprise, Ultimate etc.
shox
84

Peut afficher un peu de flash, mais aucun fichier temporaire n'est requis. Devrait fonctionner jusqu'à quelque part dans l'ère (IIRC) IE5.

mshta javascript:alert("Message\n\nMultiple\nLines\ntoo!");close();

N'oubliez pas d' échapper vos parenthèses si vous utilisez if:

if 1 == 1 (
   mshta javascript:alert^("1 is equal to 1, amazing."^);close^(^);
)
Volaille
la source
Cela fonctionne parfaitement à partir de l'invite de commande, mais quand je le coller dans un fichier de commandes, je reçois cette erreur: close() was unexpected at this time.
eye_mew
@eye_mew peut-être que vous devez supprimer ces ^caractères d'échappement dans un fichier chauve-souris
phuclv
1
Cela a parfaitement fonctionné pour moi à partir d'un fichier batch (je suis sous Windows 7) Pouvons-nous exécuter n'importe quel Javascript de cette façon? Comment retournerions-nous les valeurs dans le fichier de commandes?
Jerry Jeremiah
1
Voici quelques exemples étonnants de choses que vous pouvez faire: dostips.com/forum/viewtopic.php?t=5311 L'exemple LocalDateTime renvoie une valeur. Merci pour l'idée!
Jerry Jeremiah
Cool node.js par Microsoft avant JavaScript côté serveur était cool - une occasion manquée pour eux.
Daniel Sokolowski
76

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

START CMD /C "ECHO My Popup Message && PAUSE"
Dave Webb
la source
1
ty génial! Je pourrais l'utiliser dans quelques autres scripts :)
billyy
3
Une meilleure option serait:, start cmd /c "@echo off & mode con cols=18 lines=2 & echo My Popup Message & pause>nul"remplacez le cols=18par le nombre de caractères dans le message + 2. Et le lines=2à quel que soit le nombre de lignes est + 1.
ender_scythe
1
se débarrasser de la PAUSE et utilisercmd /k
Artelius
34

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 command.com recherchera les fichiers à partir de, puis sur la ligne suivante:

"insert name of your vbscript here".vbs

Ensuite, vous créez un nouveau document Bloc-notes , tapez

<script type="text/vbscript">
    MsgBox "your text here"
</script>

Vous enregistrez ensuite ceci en tant que fichier .vbs (en mettant «.vbs» à la fin du nom de fichier), enregistrez-le sous «Tous les fichiers» dans la liste déroulante sous le nom du fichier (il ne sera donc pas enregistré sous .txt ), puis cliquez sur Enregistrer!

Unièdre
la source
3
Vous n'avez pas besoin de l' <script/>étiquette.
surfasb
? comment insérer une nouvelle ligne (lignes vides) dans le texte lors de l'utilisation -> MSG * <text>
ZEE
@ZEE Si vous utilisez uniquement, msg *vous serez invité à entrer un message suivi de ctrl-Z. Vous pouvez saisir ici des sauts de ligne qui apparaîtront dans votre message.
User5910
30

Quelques autres moyens.

1) Le plus geek et le plus piraté - il utilise IEXPRESS pour créer un petit exe qui créera un pop-up avec un seul bouton ( il peut créer deux autres types de messages pop-up ). Fonctionne sur TOUTES les fenêtres 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 MSHTA. Fonctionne également sur toutes les machines Windows à partir de XP et plus (malgré le fait que l'OP ne veut pas de langues "externes", le JavaScript est ici minimisé). Doit être enregistré sous .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 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 l' .bat/jscripthybride paramétré (doit être enregistré sous bat). Il utilise à nouveau JavaScript malgré la requête OP, mais comme il s'agit d'une batte, elle peut être appelée comme un fichier bat sans soucis. Il utilise POPUP qui permet un peu plus de contrôle que le MSGBOX plus populaire . 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/.bathybride (doit être enregistré sous .bat) .Cette fois, il utilise .NETet compile un petit .exefichier 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 un pop-up (peut être appelé à partir de la ligne de commande ou du 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
npocmaka
la source
29

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
dc1
la source
15

Voici une variante de PowerShell qui ne nécessite pas le chargement d'assemblys avant de créer la fenêtre, mais elle s'exécute nettement 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 changer le dernier paramètre de "0x0" à une valeur ci-dessous pour afficher les icônes dans la boîte de dialogue (voir Méthode Popup pour plus d'informations):

        Arrêtez0x10 Stop
        Point d'interrogation0x20 Point d'interrogation
        Point d'exclamation0x30 Point d'exclamation
        Marque d'information 0x40 Marque d'information

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

Utilisateur5910
la source
10
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 '+') 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 n'importe quel nombre de 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  
p2013
la source
2
Comment obtenez-vous une réponse du script VB?
Suit Boy Apps
7

Msg * "insérez votre message ici"

fonctionne bien, enregistrez simplement en tant que fichier .bat dans le bloc-notes ou assurez-vous que le format est défini sur "tous les fichiers"

Max Runacres
la source
Les documents disent que "*" va "envoyer un message à toutes les sessions sur le serveur spécifié", c'est-à-dire. s'interrompra sur les services terminaux ou la commutation rapide d'utilisateur
Fowl
2
vous pourriez utilisermsg %SESSIONNAME% msg
Fowl
5
msg * /time:0 /w Hello everybody!

Ce message attend indéfiniment jusqu'à ce que vous cliquiez sur OK (cela ne dure qu'une minute par défaut) et fonctionne correctement sous Windows 8.1

MoE bis
la source
La même réponse est présente depuis 2009
jeb
Oups> _ <Veuillez le supprimer :)
MoE bis
? comment insérer une nouvelle ligne (lignes vides) dans le texte
ZEE
3
msg * /time:0 /w <C:\Somewhere\Message.txtoù dans le fichier se trouve du texte normal (contenant des CrLf).
MoE bis
4

Pour ce faire, vous devez avoir un petit programme qui affiche une boîte de message et l'exécute à partir de votre fichier de commandes.

Vous pouvez ouvrir une fenêtre de console qui affiche une invite, mais obtenir une boîte de message GUI en utilisant uniquement cmd.exe et amis n'est pas possible, AFAIK.

Macke
la source
une invite pourrait le faire ... avez-vous plus à ce sujet?
billyy
1
echo "xx", pause ou set / p var = prompt sont des options cmd.exe
Macke
@ nickl-: mieux comme ça?
Macke
3

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

zhongshu
la source
Selon l'antivirus Symantec, cette archive contient un cheval de Troie.
David
3
@David - J'ai eu des fichiers batch et texte marqués comme hostiles par les antivirus. En fait, l'antivirus AVG a attrapé une instruction de ligne de commande et prétendu qu'il s'agissait d'un virus.
James K
2
FWIW Virus Total indique que 11/51 antivirus détectent les virus sur ce fichier: virustotal.com/en/file
Matthew Lock
3

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

Il est multiplateforme: un programme d'installation Windows pour Windows peut être trouvé ici .

parvus
la source
3

Suite à la réponse de @ Fowl, vous pouvez l'améliorer avec un délai d'attente pour n'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.

Rafi
la source
Détecté comme virus xD
Julien
2

Vous pouvez appeler la fonction dll à partir de user32.dll je pense quelque chose comme

Rundll32.exe user32.dll, MessageBox (0, "text", "titleText", {indicateurs supplémentaires pour la boîte de message comme la plus haute, etc.})

En le tapant depuis mon téléphone, ne me jugez pas ... sinon je lierais les drapeaux supplémentaires.

Entropie
la source
Je peux rundll32.exe user32.dll,MessageBoxA Xafficher une boîte de message avec X comme titre lorsque je le fais dans la zone Exécuter. Peu importe ce que je fais de X, je ne peux pas le faire interpréter comme plusieurs paramètres - tout entre dans le titre. Donc, rundll32.exe user32.dll,MessageBoxA (0, "MyTitle", "MyText", 0)affiche une boîte de message avec un titre de (0, "MyTitle", "MyText", 0) Mais je ne peux pas le faire fonctionner DU TOUT à partir de la ligne de commande - uniquement à partir de la zone Exécuter. Sur la ligne de commande, cela ne fait rien du tout. Cela fonctionne-t-il à coup sûr à partir d'une ligne de commande ou d'un fichier de commandes ou uniquement à partir de la zone Exécuter?
Jerry Jeremiah
rundll32.exe selon doc ne peut exécuter que les procédures spécialement conçues à cet effet, car ils doivent analyser la partie "arguments facultatifs". Les fonctions MessageBox-ish n'ont pas été conçues de cette façon. Pourquoi ça marche via Win + R (Run box), c'est encore une grande question!
Yuriy Pozniak
1

msg * /server:127.0.0.1 Tapez votre message ici

Franco
la source
Windows cmd.exe dit: «msg» n'est pas reconnu comme une commande interne ou externe, un programme utilisable ou un fichier de commandes.
Anthony Hatzopoulos
@AnthonyHatzopoulos c'est parce qu'il n'est pris en charge que sous XP
pattyd
@pattyd XP et plus tard, en fait
Jesan Fafon
@JesanFafon non, il a été interrompu après XP ... Je pense que vous voulez dire XP et plus tôt
pattyd
@pattyd Sous Windows 8.1, where msgretourne C:\Windows\System32\msg.exe. Je pense que vous pensez ànet send
Jesan Fafon
1

Cette application peut le faire si vous convertissez (enveloppez) vos fichiers batch en fichiers exécutables.


  1. Boîte de message simple

    %extd% /messagebox Title Text
    

  1. Message d'erreur

    %extd% /messagebox  Error "Error message" 16
    
  2. Annuler Réessayer Messagebox

    %extd% /messagebox Title "Try again or Cancel" 5
    

4) Messagebox "Ne plus jamais me demander"

%extd% /messageboxcheck Title Message 0 {73E8105A-7AD2-4335-B694-94F837A38E79}
quelqu'un23432
la source
0

Une meilleure option

set my_message=Hello world&& start cmd /c "@echo off & mode con cols=15 lines=2 & echo %my_message% & pause>nul"


Description:
lines= nombre de lignes, plus 1
cols= nombre de caractères dans le message, plus 3 (Cependant, le minimum doit être15 )

colsVersion 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"

T.Todua
la source
@ender_scythe comment fonctionne ( start cmd /c "@echo off & mode con cols=18 lines=2 & echo My Popup Message & pause>nul"). Le vôtre ne l'est pas. Il fait écho au message mais ne parvient pas à définir la taille de la fenêtre retournant The screen cannot be set to the number of lines and columns specified.au moins dans mon Windows 7.
cdlvcdlv
@cdlvcdlv J'ai mis à jour la réponse. cela devrait fonctionner maintenant pour tout le monde, réviser.
T.Todua
Cela fonctionne en effet ... à condition qu'il n'y ait pas de fichier nommé xdans le répertoire courant ou que cela ne vous dérange pas de le perdre.
cdlvcdlv
Vous avez pris un commentaire parfaitement fonctionnel et l'a cassé. Ensuite, vous avez essayé d'ajouter de la valeur (je vous l'accorde), mais au prix de perdre n'importe quel fichier avec un nom pas si improbable. Si quelqu'un (par curiosité) essaie votre code avec une telle malchance, il perdra le fichier pour de bon. En outre, s'il existe un dossier nommé x, votre commande échoue tout simplement. Ne me remerciez pas et corrigez simplement votre code. Vous n'avez même pas besoin d'utiliser une doublure. Et si vous pensez que votre code est si bon, veuillez le publier dans Code Review .
cdlvcdlv
quelle ingratitude .... je n'ai pas cassé, mais mis à jour, expliqué et même donné une solution automatique ... (mais il y a des gens comme vous, que je ne peux pas satisfaire). bonne chance
T.Todua
0

Voici mon script batch que j'ai mis en place sur la base des bonnes réponses ici et dans d'autres articles

Vous pouvez définir le délai d'expiration du titre et même mettre en veille pour le programmer pour ce dernier et \ n pour une nouvelle ligne

Nommez-le popup.bat et placez-le dans votre dossier de chemin Windows pour qu'il fonctionne globalement sur votre PC

Par exemple popup Line 1\nLine 2produira une boîte contextuelle de 2 lignes (tapezpopup /? pour l'utilisation)

Voici le code

<!-- : Begin CMD
@echo off
cscript //nologo "%~f0?.wsf" %*
set pop.key=[%errorlevel%]
if %pop.key% == [-1] set pop.key=TimedOut
if %pop.key% == [1]  set pop.key=Ok
if %pop.key% == [2]  set pop.key=Cancel
if %pop.key% == [3]  set pop.key=Abort
if %pop.key% == [4]  set pop.key=Retry
if %pop.key% == [5]  set pop.key=Ignore
if %pop.key% == [6]  set pop.key=Yes
if %pop.key% == [7]  set pop.key=No
if %pop.key% == [10] set pop.key=TryAgain
if %pop.key% == [11] set pop.key=Continue
if %pop.key% == [99] set pop.key=NoWait
exit /b 
-- End CMD -->

<job><script language="VBScript">
'on error resume next
q   =""""
qsq =""" """
Set objArgs = WScript.Arguments
Set objShell= WScript.CreateObject("WScript.Shell")
Popup       =   0
Title       =   "Popup"
Timeout     =   0
Mode        =   0
Message     =   ""
Sleep       =   0
button      =   0
If objArgs.Count = 0 Then 
    Usage()
ElseIf objArgs(0) = "/?" or Lcase(objArgs(0)) = "-h" or Lcase(objArgs(0)) = "--help" Then 
    Usage()
End If
noWait = Not wait() 
For Each arg in objArgs
    If (Mid(arg,1,1) = "/") and (InStr(arg,":") <> 0) Then haveSwitch   =   True
Next
If not haveSwitch Then 
    Message=joinParam("woq")
Else
    For i = 0 To objArgs.Count-1 
        If IsSwitch(objArgs(i)) Then 
            S=split(objArgs(i) , ":" , 2)
                select case Lcase(S(0))
                    case "/m","/message"
                        Message=S(1)
                    case "/tt","/title"
                        Title=S(1)
                    case "/s","/sleep"
                        If IsNumeric(S(1)) Then Sleep=S(1)*1000
                    case "/t","/time"
                        If IsNumeric(S(1)) Then Timeout=S(1)
                    case "/b","/button"
                        select case S(1)
                            case "oc", "1"
                                button=1
                            case "ari","2"
                                button=2
                            case "ync","3"
                                button=3
                            case "yn", "4"
                                button=4
                            case "rc", "5"
                                button=5
                            case "ctc","6"
                                button=6
                            case Else
                                button=0
                        end select
                    case "/i","/icon"
                        select case S(1)
                            case "s","x","stop","16"
                                Mode=16
                            case "?","q","question","32"
                                Mode=32
                            case "!","w","warning","exclamation","48"
                                Mode=48
                            case "i","information","info","64"
                                Mode=64
                            case Else 
                                Mode=0
                        end select
                end select
        End If
    Next
End If
Message = Replace(Message,"/\n", "°"  )
Message = Replace(Message,"\n",vbCrLf)
Message = Replace(Message, "°" , "\n")
If noWait Then button=0

Wscript.Sleep(sleep)
Popup   = objShell.Popup(Message, Timeout, Title, button + Mode + vbSystemModal)
Wscript.Quit Popup

Function IsSwitch(Val)
    IsSwitch        = False
    If Mid(Val,1,1) = "/" Then
        For ii = 3 To 9 
            If Mid(Val,ii,1)    = ":" Then IsSwitch = True
        Next
    End If
End Function

Function joinParam(quotes)
    ReDim ArgArr(objArgs.Count-1)
    For i = 0 To objArgs.Count-1 
        If quotes = "wq" Then 
            ArgArr(i) = q & objArgs(i) & q 
        Else
            ArgArr(i) =     objArgs(i)
        End If
    Next
    joinParam = Join(ArgArr)
End Function

Function wait()
    wait=True
    If objArgs.Named.Exists("NewProcess") Then
        wait=False
        Exit Function
    ElseIf objArgs.Named.Exists("NW") or objArgs.Named.Exists("NoWait") Then
        objShell.Exec q & WScript.FullName & qsq & WScript.ScriptFullName & q & " /NewProcess: " & joinParam("wq") 
        WScript.Quit 99
    End If
End Function

Function Usage()
    Wscript.Echo _
                     vbCrLf&"Usage:" _
                    &vbCrLf&"      popup followed by your message. Example: ""popup First line\nescaped /\n\nSecond line"" " _
                    &vbCrLf&"      To triger a new line use ""\n"" within the msg string [to escape enter ""/"" before ""\n""]" _
                    &vbCrLf&"" _
                    &vbCrLf&"Advanced user" _
                    &vbCrLf&"      If any Switch is used then you must use the /m: switch for the message " _
                    &vbCrLf&"      No space allowed between the switch & the value " _
                    &vbCrLf&"      The switches are NOT case sensitive " _
                    &vbCrLf&"" _
                    &vbCrLf&"      popup [/m:""*""] [/t:*] [/tt:*] [/s:*] [/nw] [/i:*]" _
                    &vbCrLf&"" _
                    &vbCrLf&"      Switch       | value |Description" _
                    &vbCrLf&"      -----------------------------------------------------------------------" _
                    &vbCrLf&"      /m: /message:| ""1 2"" |if the message have spaces you need to quote it " _
                    &vbCrLf&"                   |       |" _
                    &vbCrLf&"      /t: /time:   | nn    |Duration of the popup for n seconds " _
                    &vbCrLf&"                   |       |<Default> untill key pressed" _
                    &vbCrLf&"                   |       |" _
                    &vbCrLf&"      /tt: /title: | ""A B"" |if the title have spaces you need to quote it " _
                    &vbCrLf&"                   |       | <Default> Popup" _
                    &vbCrLf&"                   |       |" _
                    &vbCrLf&"      /s: /sleep:  | nn    |schedule the popup after n seconds " _
                    &vbCrLf&"                   |       |" _
                    &vbCrLf&"      /nw /NoWait  |       |Continue script without the user pressing ok - " _
                    &vbCrLf&"                   |       | botton option will be defaulted to OK button " _
                    &vbCrLf&"                   |       |" _
                    &vbCrLf&"      /i: /icon:   | ?/q   |[question mark]"  _
                    &vbCrLf&"                   | !/w   |[exclamation (warning) mark]"  _
                    &vbCrLf&"                   | i/info|[information mark]"  _
                    &vbCrLf&"                   | x/stop|[stop\error mark]" _
                    &vbCrLf&"                   | n/none|<Default>" _
                    &vbCrLf&"                   |       |" _
                    &vbCrLf&"      /b: /button: | o     |[OK button] <Default>"  _
                    &vbCrLf&"                   | oc    |[OK and Cancel buttons]"  _
                    &vbCrLf&"                   | ari   |[Abort, Retry, and Ignore buttons]"  _
                    &vbCrLf&"                   | ync   |[Yes, No, and Cancel buttons]" _
                    &vbCrLf&"                   | yn    |[Yes and No buttons]" _
                    &vbCrLf&"                   | rc    |[Retry and Cancel buttons]" _
                    &vbCrLf&"                   | ctc   |[Cancel and Try Again and Continue buttons]" _
                    &vbCrLf&"      --->         | --->  |The output will be saved in variable ""pop.key""" _
                    &vbCrLf&"" _
                    &vbCrLf&"Example:" _
                    &vbCrLf&"        popup /tt:""My MessageBox"" /t:5 /m:""Line 1\nLine 2\n/\n\nLine 4""" _
                    &vbCrLf&"" _
                    &vbCrLf&"                     v1.9 By RDR @ 2020"
    Wscript.Quit
End Function

</script></job>
RDR
la source
-3

il doit SEULEMENT apparaître à l'intérieur d'une vm, donc techniquement, il devrait y avoir du code comme:

if %machine_type% == virtual_machine then
   echo message box code
else
   continue normal installation code
Étranger illégal
la source
downvote car l'installation ne sera pas poursuivie si (% machine_type% == virtual_machine) == true
anion