Zeigen Sie ein Popup- / Meldungsfeld aus einer Windows-Batchdatei an

153

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

Billyy
quelle
CMD.EXE ist ein 32-Bit-Befehlsprozessor, der DOS-Befehle unterstützt.
Alan B
7
Es heißt Windows-Eingabeaufforderung.
Ricardo Polo Jaramillo

Antworten:

121

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

So etwas wie das Folgende wurde 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."

MsgBoxReferenz, wenn Sie an dieser Route interessiert sind.

Boflynn
quelle
danke, dass es tun würde, ich werde eine Datei erstellen, diese Daten darauf schreiben und sie dann verwenden, als sie zu löschen. sollte gut funktionieren :)
Billyy
1
Gute Antwort. Auf diese Weise haben Sie die vollständige Kontrolle über Symbole, Schaltflächen und Feldtitel. Auch wenn Sie Ihre Datei irgendwo entlang PATH speichern, rufen Sie sie von einem beliebigen Ort aus auf. Ich habe einige Dateien für Warnungen mit verschiedenen Symbolen erstellt.
Deus777
Nett. Übrigens müssen Sie CScript zumindest in Win10 nicht verwenden. Mit CScript erhalte ich zusätzlichen Text in der Eingabeaufforderung. Ohne CScript gibt es nur die Warnung, die großartig ist
Ein Kind Gottes
Ich hatte kein cscript. Ich habe stattdessen start verwendet.
sureshvv
127

Zunächst einmal hat DOS nichts damit zu tun, Sie möchten wahrscheinlich 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 net sendoder oder msg. net sendfunktioniert nur unter älteren Windows-Versionen:

net send localhost Some message to display

Dies hängt jedoch auch vom auszuführenden Messenger-Dienst ab.

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

msg "%username%" Some message to display

Es ist zu beachten, dass ein mit gesendetes Nachrichtenfeld msg.exenur 60 Sekunden lang gültig ist. Dies kann jedoch mit dem /time:xxSchalter überschrieben werden.

Joey
quelle
2
Sie können env-Variablen verwenden, um den lokalen Benutzer% USERNAME% abzurufen. msg.exe befindet sich auf meinem XP Home-Computer, aber ich habe einzelne Berichte gehört, dass es nicht auf jeder Vista-Version verfügbar ist. Ich glaube, der Dienst hinter NET SEND ist heutzutage deaktiviert.
McDowell
Richtig, danke, ich habe die Umgebung vergessen (benutze selten etwas anderes als% UserProfile% und meine eigenen definierten in Stapeln :)). Komisch, aber Sie haben Recht mit dem Messenger-Dienst. Es existiert nicht einmal auf meiner XP-VM, aber Net Send existiert noch. msg.exe funktioniert dort allerdings.
Joey
18
Ich dachte, dass eine praktikable Option in den Antworten fehlte und lieferte sie. Hier ist nichts falsch. Weder müssen Sie sich gezwungen fühlen, etwas zu tun, noch sage ich irgendwie, dass Boflynn falsch ist. Ich habe gerade eine weitere Option hinzugefügt, die für Fragen, die keine einzige endgültige Antwort haben, vollkommen in Ordnung sein sollte. Darüber hinaus sind Sie wahrscheinlich nicht der einzige mit dieser Frage, und andere möchten VBScript möglicherweise aus irgendeinem Grund nicht verwenden. Dies ist eine Community-Site, nicht nur deine :-)
Joey
8
Ich selbst habe dies nur verwendet, um eine "Ich liebe dich" -Nachricht auf dem PC meiner Freundin von einer Remote-Shell aus zu erzeugen.
Camilo Martin
1
Unter Windows 8 und 10 habe ich festgestellt, dass die Version von Windows wichtig ist. Für mich funktioniert es auf Pro aber nicht zu Hause. Andere haben berichtet, dass es auf Home Premium und Enterprise, Ultimate usw. funktioniert. Es scheint, dass altes Zuhause es nicht bekommt (es existiert nicht in System32, kann aber hinzugefügt werden).
Shox
84

Möglicherweise wird ein kleiner Blitz angezeigt, es sind jedoch keine temporären Dateien erforderlich. Sollte bis irgendwo in der (IIRC) IE5-Ära funktionieren.

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

Vergessen Sie nicht, sich Ihren Klammern zu entziehen, wenn Sie Folgendes verwenden if:

if 1 == 1 (
   mshta javascript:alert^("1 is equal to 1, amazing."^);close^(^);
)
Geflügel
quelle
Dies funktioniert perfekt über die Eingabeaufforderung, aber wenn ich es in eine Batch-Datei stecke, erhalte ich folgende Fehlermeldung : close() was unexpected at this time.
eye_mew
@eye_mew Vielleicht müssen Sie diese ^Escape-Zeichen in einer Fledermaus-Datei entfernen
phuclv
1
Es hat perfekt für mich aus einer Batch-Datei (ich bin unter Windows 7) funktioniert. Können wir Javascript auf diese Weise ausführen? Wie würden wir Werte an die Batch-Datei zurückgeben?
Jerry Jeremiah
1
Hier sind einige erstaunliche Beispiele für Dinge, die Sie tun können: dostips.com/forum/viewtopic.php?t=5311 Das LocalDateTime-Beispiel gibt einen Wert zurück. Danke für die Idee!
Jerry Jeremiah
Cool node.js von Microsoft vor dem serverseitigen JavaScript war cool - eine verpasste Gelegenheit für sie.
Daniel Sokolowski
76

Daraufhin wird ein weiteres Eingabeaufforderungsfenster angezeigt:

START CMD /C "ECHO My Popup Message && PAUSE"
Dave Webb
quelle
1
Super ty! Ich könnte dies in ein paar anderen Skripten verwenden :)
Billyy
3
Eine bessere Option wäre: start cmd /c "@echo off & mode con cols=18 lines=2 & echo My Popup Message & pause>nul"Ändern Sie die cols=18Anzahl der Zeichen in der Nachricht + 2. Und die lines=2Anzahl der Zeilen beträgt + 1.
ender_scythe
1
PAUSE loswerden und benutzencmd /k
Artelius
34

Versuchen :

Msg * "insert your message here" 

Wenn Sie command.com von Windows XP 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 mit Ihrer .bat-Datei verwenden. Sie würden es mit diesem Befehl aus der bat-Datei öffnen:

cd C:\"location of vbscript"

Dies ändert das Verzeichnis, in dem command.com nach Dateien sucht, und dann in der nächsten Zeile:

"insert name of your vbscript here".vbs

Anschließend erstellen Sie ein neues Editor- Dokument und geben es ein

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

Sie würden dies 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 es nicht als .txt gespeichert wird ), dann klicken Sie auf Speichern!

Unihedron
quelle
3
Sie brauchen das <script/>Tag nicht.
Surfasb
Wie füge ich eine neue Zeile (leere Zeilen) in den Text ein, wenn ich -> MSG * <text>
ZEE
@ZEE Wenn Sie nur verwenden, werden msg *Sie aufgefordert, eine Nachricht gefolgt von Strg-Z einzugeben. Hier können Sie Zeilenumbrüche eingeben, die in Ihrer Nachricht angezeigt werden.
User5910
30

Nur noch wenige Möglichkeiten.

1) Das geekeste und hackigste - es verwendet den IEXPRESS, um eine kleine Exe zu erstellen, die ein Popup mit einer einzigen Schaltfläche erstellt ( es können zwei weitere Arten von Popup-Nachrichten erstellt werden ). Funktioniert unter JEDEM Windows ab XP:

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

@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 parametrisierter .bat/jscriptHybrid (sollte gespeichert werden als bat). Trotz der OP-Anfrage wird wieder JavaScript verwendet, aber da es sich um eine Fledermaus handelt, kann es problemlos als Fledermausdatei aufgerufen werden. Es verwendet POPUP, das etwas mehr Kontrolle ermöglicht als das populärere MSGBOX . Es verwendet WSH, aber 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/.batHybrid (sollte gespeichert werden als .bat). Dieses Mal verwendet .NETund kompiliert es eine kleine .exeDatei, 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 einzelner Aufruf von Powershell, der ein Popup erstellt (kann über die Befehlszeile oder über den Stapel 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 der Ansatz des Dbenham hier gesehen

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

7 ) Für ein System - Tray - Benachrichtigungen können Sie versuchen , diese :

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

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

Der Vorteil der Verwendung von MSGBOX ist, dass es wirklich anpassbar ist (Titel, Symbol usw. ändern), 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
dc1
quelle
15

Hier ist eine PowerShell-Variante, bei der vor dem Erstellen des Fensters keine Baugruppen geladen werden müssen. Sie wird jedoch deutlich langsamer ausgeführt (~ + 50%) als der hier von @npocmaka veröffentlichte 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 unten ändern, um Symbole im Dialogfeld anzuzeigen ( weitere Informationen finden Sie unter Popup-Methode ):

        Halt0x10 Stop
        Fragezeichen0x20 Fragezeichen
        Ausrufezeichen0x30 Ausrufezeichen
        Informationsmarke0x40 Informationszeichen

Angepasst an den Microsoft TechNet-Artikel PowerTip: Verwenden Sie PowerShell, um das Popup-Fenster anzuzeigen .

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

–Sie können beliebige Zahlen von 0,1,2,3,4 anstelle von 0 (vor dem Symbol '+') schreiben. 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  
p2013
quelle
2
Wie erhalten Sie eine Antwort vom VB-Skript?
Suit Boy Apps
7

Nachricht * "Geben Sie hier Ihre Nachricht ein"

funktioniert einwandfrei, speichern Sie es einfach als .bat-Datei im Editor oder stellen Sie sicher, dass das Format auf "alle Dateien" eingestellt ist.

Max Runacres
quelle
Die Dokumente sagen, dass "*" "Nachricht an alle Sitzungen auf dem angegebenen Server senden" wird, dh. wird auf Terminaldiensten oder schnellem Benutzerwechsel brechen
Fowl
2
Sie könnten verwendenmsg %SESSIONNAME% msg
Geflügel
5
msg * /time:0 /w Hello everybody!

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

MoE bis
quelle
Die gleiche Antwort ist seit 2009 vorhanden
jeb
Ups> _ <Bitte löschen Sie es :)
MoE bis
Wie man eine neue Zeile (leere Zeilen) in den Text
einfügt
3
msg * /time:0 /w <C:\Somewhere\Message.txtDabei befindet sich in der Datei normaler Text (der CrLfs enthält).
MoE bis
4

Dazu benötigen Sie ein kleines Programm, das eine Meldungsbox anzeigt und diese aus Ihrer Batchdatei ausführt.

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

Macke
quelle
eine Eingabeaufforderung könnte es tun ... haben Sie mehr darüber?
Billyy
1
Echo "xx", Pause oder set / p var = Eingabeaufforderung sind cmd.exe-Optionen
Macke
@ nickl-: besser so?
Macke
3

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

zhongshu
quelle
Laut Symantec Antivirus enthält dieses Archiv einen Trojaner.
David
3
@ David - Ich habe Batch- und Textdateien von Virenschutzprogrammen als feindlich gekennzeichnet. Tatsächlich hat AVG Antivirus eine Befehlszeilenanweisung abgefangen und behauptet, es sei ein Virus.
James K
2
Laut FWIW Virus Total erkennen 11/51 Virenprüfer Viren in dieser Datei: virustotal.com/de/file/…
Matthew Lock
3

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 .

Parvus
quelle
3

Wenn Sie der Antwort von @ Fowl folgen, können Sie sie mit einer Zeitüberschreitung verbessern, die nur 10 Sekunden lang angezeigt wird, indem Sie Folgendes verwenden:

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

Sehen Sie hier für weitere Details.

Rafi
quelle
Erkannt als Virus xD
Julien
2

Sie können die DLL-Funktion von user32.dll aus aufrufen

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

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

Entropie
quelle
Ich kann rundll32.exe user32.dll,MessageBoxA Xeine Nachrichtenbox mit X als Titel anzeigen, wenn ich dies im Feld Ausführen mache. Egal, was ich X mache, ich kann es nicht als mehrere Parameter interpretieren lassen - alles geht in den Titel. rundll32.exe user32.dll,MessageBoxA (0, "MyTitle", "MyText", 0)Zeigt also ein Meldungsfeld mit dem Titel " (0, "MyTitle", "MyText", 0) Aber ich kann es überhaupt nicht zum Laufen bringen" über die Befehlszeile an - nur über das Feld "Ausführen". In der Kommandozeile macht es überhaupt nichts. Funktioniert es sicher über eine Befehlszeile oder aus einer Batchdatei oder nur über das Feld Ausführen?
Jerry Jeremiah
rundll32.exe gemäß doc kann nur die Prozeduren ausführen, die speziell für diesen Zweck entwickelt wurden, da sie den Teil "optionale Argumente" analysieren müssen. MessageBox-ish-Funktionen wurden nicht auf diese Weise entwickelt. Warum es über Win + R (Run Box) funktioniert, ist immer noch eine große Frage!
Yuriy Pozniak
1

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

Franco
quelle
Windows cmd.exe sagt: 'msg' wird nicht als interner oder externer Befehl, bedienbares Programm oder Batchdatei erkannt.
Anthony Hatzopoulos
@AnthonyHatzopoulos das ist, weil es nur in XP unterstützt wird
pattyd
@ Pattyd XP und später eigentlich
Jesan Fafon
@JesanFafon nein, es wurde nach XP eingestellt ... Ich denke, Sie meinen XP und früher
Pattyd
@pattyd Gibt unter Windows 8.1 where msgzurück C:\Windows\System32\msg.exe. Ich denke, Sie denken annet send
Jesan Fafon
1

Diese Anwendung kann dies tun, wenn Sie Ihre Batch-Dateien in ausführbare Dateien konvertieren (umbrechen).


  1. Einfache Messagebox

    %extd% /messagebox Title Text
    

  1. Fehlermeldung

    %extd% /messagebox  Error "Error message" 16
    
  2. Abbrechen Versuchen Sie es erneut Messagebox

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

4) Messagebox "Nie wieder fragen"

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

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 sein 15)

Automatisch berechnete colsVersion:

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
quelle
@ender_scythe Kommentar funktioniert ( start cmd /c "@echo off & mode con cols=18 lines=2 & echo My Popup Message & pause>nul"). Dein nicht. Es gibt die Nachricht wieder, kann jedoch die Fenstergröße nicht festlegen, die The screen cannot be set to the number of lines and columns specified.zumindest in Windows 7 zurückgegeben wird.
cdlvcdlv
@cdlvcdlv Ich habe die Antwort aktualisiert. es sollte jetzt für alle funktionieren, überarbeiten Sie es.
T.Todua
Es funktioniert in der Tat ... vorausgesetzt, es befindet sich keine Datei xim aktuellen Verzeichnis oder es macht Ihnen nichts aus, sie zu verlieren.
cdlvcdlv
Sie haben einen perfekt funktionierenden Kommentar aufgenommen und ihn gebrochen. Dann haben Sie versucht, einen Mehrwert zu schaffen (das gebe ich Ihnen zu), aber dann um den Preis, eine Datei mit einem nicht so unwahrscheinlichen Namen zu verlieren. Wenn jemand (aus Neugier) Ihren Code mit so viel Pech ausprobiert, verliert er die Datei endgültig. Wenn außerdem ein Ordner mit dem Namen vorhanden ist x, schlägt Ihr Befehl nur fehl. Danke mir nicht und bitte repariere einfach deinen Code. Sie müssen nicht einmal einen Einzeiler verwenden. Und wenn Sie der Meinung sind, dass Ihr Code so gut ist, veröffentlichen Sie ihn bitte in Code Review .
cdlvcdlv
Was für eine Undankbarkeit ... Ich habe nicht gebrochen, sondern aktualisiert, erklärt und sogar eine automatische Lösung gegeben ... (aber es gibt Leute wie Sie, die ich nicht befriedigen kann).
Viel
0

Hier ist mein Batch-Skript, das ich basierend auf den guten Antworten hier und in anderen Posts zusammengestellt habe

Sie können das Titel-Timeout und sogar den Ruhezustand festlegen, um es für letztere & \ n für neue Zeilen zu planen

Nennen Sie es popup.bat und legen Sie es in Ihrem Windows-Pfadordner ab, damit es global auf Ihrem PC funktioniert

Beispielsweise popup Line 1\nLine 2wird ein Popup-Feld mit zwei Zeilen erstellt (Typ popup /?für die Verwendung).

Hier ist der 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
quelle
-3

Es muss NUR in einer VM eingeblendet werden. Technisch gesehen sollte es also Code geben wie:

if %machine_type% == virtual_machine then
   echo message box code
else
   continue normal installation code
Illegales Alien
quelle
Downvote, da die Installation nicht fortgesetzt wird, wenn (% machine_type% == virtual_machine) == true
anion