it-swarm.com.de

Ein Popup / Meldungsfeld aus einer Windows-Batchdatei anzeigen

Gibt es eine Möglichkeit, ein Meldungsfeld aus einer Batch-Datei anzuzeigen (ähnlich wie xmessage in Bash-Skripten unter Linux verwendet werden kann)?

140
billyy

Ich würde eine sehr einfache VBScript-Datei erstellen und sie mit CScript aufrufen, um die Befehlszeilenparameter zu analysieren.

So etwas wie das Folgende gespeichert in MessageBox.vbs:

Set objArgs = WScript.Arguments
messageText = objArgs(0)
MsgBox messageText

Was du gerne nennen würdest:

cscript MessageBox.vbs "This will be shown in a popup."

MsgBox reference wenn Sie an dieser Route interessiert sind.

112
boflynn

Erstens hat DOS nichts damit zu tun, wahrscheinlich möchten Sie eine Windows-Befehlszeilenlösung (wieder: kein DOS, reines Windows, nur kein Fenster, sondern eine Konsole).

Sie können entweder die von boflynn bereitgestellte VBScript-Methode verwenden oder net send Oder msg falsch verwenden. net send Funktioniert nur unter älteren Windows-Versionen:

net send localhost Some message to display

Dies hängt jedoch auch vom auszuführenden Nachrichtendienst ab.

Für neuere Versionen (anscheinend XP und höher):

msg "%username%" Some message to display

Es ist zu beachten, dass ein mit msg.exe Gesendetes Meldungsfeld nur 60 Sekunden lang gültig ist. Dies kann jedoch mit dem Schalter /time:xx Überschrieben werden.

121
Joey

Möglicherweise blinkt es ein wenig, es sind jedoch keine temporären Dateien erforderlich. Sollte bis irgendwohin in der (IIRC) IE5-Ära zurückreichen.

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

Vergiss nicht entkomme den Klammern wenn du if verwendest:

if 1 == 1 (
   mshta javascript:alert^("1 is equal to 1, amazing."^);close^(^);
)
83
Fowl

Dies öffnet ein weiteres Eingabeaufforderungsfenster:

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

Versuchen :

Msg * "insert your message here" 

Wenn Sie Windows XP Command.com verwenden, wird ein Meldungsfeld geöffnet.

Das Öffnen eines neuen Cmd-Fensters ist nicht ganz das, wonach Sie gefragt haben. Sie können auch VBScript verwenden und dies zusammen mit Ihrer .bat-Datei verwenden. Sie würden es aus der bat-Datei mit diesem Befehl öffnen:

cd C:\"location of vbscript"

Ändern Sie das Verzeichnis, in dem command.com nach Dateien sucht, und klicken Sie dann in der nächsten Zeile auf:

"insert name of your vbscript here".vbs

Dann erstellen Sie ein neues Notepad Dokument, geben Sie ein

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

Sie würden diese Datei dann als .vbs-Datei speichern (indem Sie ".vbs" am Ende des Dateinamens einfügen) und als "Alle Dateien" im Dropdown-Feld unter dem Dateinamen speichern (damit sie nicht als .txt gespeichert wird) ) und dann auf Speichern!

33
Justsomen00b

Auf diese Weise erstellt Ihre Batch-Datei ein VBS-Skript und zeigt ein Popup an. Nach der Ausführung löscht die Batch-Datei diese Zwischendatei.

Der Vorteil der Verwendung von MSGBOX ist, dass es wirklich anpassbar ist (ändern Sie den Titel, das Symbol usw.), während MSG.exe nicht so viel ist.

echo MSGBOX "YOUR MESSAGE" > %temp%\TEMPmessage.vbs
call %temp%\TEMPmessage.vbs
del %temp%\TEMPmessage.vbs /f /q
27
dc1

Nur noch wenige Möglichkeiten.

1) Das geekiest und hackiest - es verwendet den IEXPRESS, um eine kleine exe zu erstellen, die ein Popup mit einem einzelnen Knopf erzeugt ( it kann zwei weitere Arten von Popup-Nachrichten erstellen ). Funktioniert auf JEDEN Fenstern ab XP und höher:

;@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) Verwenden von MSHTA. Funktioniert auch auf jedem Windows-Rechner ab XP und höher (obwohl das OP keine "externen" Sprachen will, wird das JavaScript hier minimiert). Sollte als .bat Gespeichert werden:

@if (true == false) @end /*!
@echo off
mshta "about:<script src='file://%~f0'></script><script>close()</script>" %*
goto :EOF */

alert("Hello, world!");

oder in einer Zeile:

mshta "about:<script>alert('Hello, world!');close()</script>"

oder

mshta "javascript:alert('message');close()"

oder

mshta.exe vbscript:Execute("msgbox ""message"",0,""title"":close")

3) Hier ist ein .bat/jscript - Hybrid parametriert (sollte als bat gespeichert werden). Trotz der OP-Anforderung wird wieder JavaScript verwendet. Da es sich jedoch um eine Fledermausdatei handelt, kann sie problemlos als Fledermausdatei aufgerufen werden. Es benutzt POPUP , was ein bisschen mehr Kontrolle erlaubt als das populärere MSGBOX . Es wird WSH verwendet, jedoch nicht MSHTA wie im obigen Beispiel.

 @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) und ein jscript.net/.bat Hybrid (sollte als .bat Gespeichert werden). Diesmal wird .NET und kompiliert eine kleine .exe - Datei, die gelöscht werden könnte:

@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) und am Ende ein einziger Aufruf von Powershell, der ein Popup erzeugt (kann von der Kommandozeile oder von Batch aufgerufen werden, wenn Powershell installiert ist) :

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

6) Und die Herangehensweise des dbenham gesehen hier

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

7 ) Für Benachrichtigungen in der Taskleiste können Sie this versuchen:

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

Hier ist eine PowerShell-Variante, bei der vor dem Erstellen des Fensters keine Assemblys geladen werden müssen, die jedoch merklich langsamer ausgeführt wird (~ + 50%) als der hier von @npocmaka bereitgestellte PowerShell MessageBox-Befehl:

powershell (New-Object -ComObject Wscript.Shell).Popup("""Operation Completed""",0,"""Done""",0x0)

Sie können den letzten Parameter von "0x0" in einen Wert ändern, um Symbole im Dialogfeld anzuzeigen (weitere Informationen finden Sie unter Popup-Methode ):

Stop 0x10 Stop
Question Mark 0x20 Fragezeichen
Exclamation Mark 0x30 Ausrufezeichen
Information Mark 0x40 Information Mark

Angepasst aus dem Microsoft TechNet-Artikel PowerTip: Verwenden Sie PowerShell zum Anzeigen des Popup-Fensters .

10
User5910
echo X=MsgBox("Message Description",0+16,"Title") >msg.vbs

–Sie können anstelle von 0 beliebige Zahlen von 0,1,2,3,4 eingeben (vor dem Symbol "+"). Hier ist die Bedeutung jeder Zahl:

0 = Ok Button  
1 = Ok/Cancel Button  
2 = Abort/Retry/Ignore button  
3 = Yes/No/Cancel  
4 = Yes/No  

–Sie können beliebige Zahlen von 16,32,48,64 anstelle von 16 (nach dem Symbol "+") schreiben. Hier ist die Bedeutung jeder Zahl:

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

Nachricht * "Geben Sie hier Ihre Nachricht ein"

funktioniert einwandfrei, einfach als .bat-Datei im Editor speichern oder sicherstellen, dass das Format auf "Alle Dateien" eingestellt ist

7
Max Runacres

Dazu benötigen Sie ein kleines Programm, das eine Nachrichtenbox anzeigt, und führen Sie diese aus Ihrer Batch-Datei aus.

Sie können ein Konsolenfenster öffnen, in dem eine Eingabeaufforderung angezeigt wird. Es ist jedoch nicht möglich, ein GUI-Meldungsfenster nur mit cmd.exe und Freunden abzurufen, AFAIK.

4
Macke
msg * /time:0 /w Hello everybody!

Diese Nachricht wartet ewig, bis auf OK geklickt wird (standardmäßig dauert sie nur eine Minute) und funktioniert in Windows 8.1 einwandfrei

3
MoE bis

Sie können Zenity verwenden. Zenity ermöglicht die Ausführung von Dialogfeldern in Befehlszeilen- und Shell-Skripten. Weitere Informationen finden Sie auch auf Wikipedia .

Es ist plattformübergreifend: Ein Windows-Installationsprogramm für Windows finden Sie hier .

3
parvus

Wenn Sie der Antwort von @ Fowl folgen, können Sie sie mit einem Timeout verbessern, das nur für 10 Sekunden angezeigt wird. Verwenden Sie dazu Folgendes:

mshta "javascript:var sh=new ActiveXObject( 'WScript.Shell' ); sh.Popup( 'Message!', 10, 'Title!', 64 );close()"

Siehe hier für weitere Details.

3
Rafi

Ich benutze ein Hilfsprogramm namens msgbox.exe von hier: http://www.paulsadowski.com/WSH/cmdprogs.htm

3
zhongshu

Sie können DLL-Funktion von user32.dll aufrufen, ich denke, etwas wie

Rundll32.exe user32.dll, MessageBox (0, "text", "titleText", {zusätzliche Flags für die oberste Nachrichtenbox e.t.c})

Tippen Sie es von meinem Telefon aus, beurteilen Sie mich nicht ... sonst würde ich die zusätzlichen Flags verknüpfen.

2
Entropy

Dies Anwendung kann dies, wenn Sie Ihre Batchdateien in ausführbare Dateien konvertieren (umbrechen).


  1. Einfache Nachrichtenbox

    %extd% /messagebox Title Text
    

  1. Fehlermeldung

    %extd% /messagebox  Error "Error message" 16
    
  2. Abbrechen Erneut versuchen Messagebox

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

4) "Frag mich nie wieder" Messagebox

%extd% /messageboxcheck Title Message 0 {73E8105A-7AD2-4335-B694-94F837A38E79}
1
someone23432

msg * /server:127.0.0.1 Geben Sie hier Ihre Nachricht ein

1
Franco

Eine bessere Option

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


Beschreibung:
lines= Anzahl der Zeilen plus 1
cols= Anzahl der Zeichen in der Nachricht plus 3 (Minimum muss jedoch 15 Sein)

Automatisch berechnete cols Version:

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