it-swarm.com.de

Wie können Sie Popup-Meldungen in einem Batch-Skript erstellen?

Ich muss wissen können, wie Popup-Meldungen in Batch-Skripts erstellt werden können ohne mit VBScript oder KiXtart oder einer anderen externen Skript-/Programmiersprache . . Ich kenne NET SEND, aber der Nachrichtendienst ist in meiner aktuellen Umgebung deaktiviert.

30
Gutsygibbon

In Bezug auf die Antwort von LittleBobbyTable funktioniert NET SEND nicht unter Vista oder Windows 7. Es wurde durch MSG.EXE ersetzt

Es gibt eine einfache Lösung, die für alle Windows-Versionen geeignet ist. Sie können eine einfache Popup-Nachricht senden, indem Sie ein neues cmd.exe-Fenster starten, das nach Drücken einer Taste geschlossen wird.

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

Wenn das Skript angehalten werden soll, bis das Meldungsfeld geschlossen wird, können Sie die Option/WAIT hinzufügen.

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

Hilft das ?

42
shredder

Sie können CSCRIPT.EXE oder WSCRIPT.EXE (die in jeder Windows-Version seit, glaube ich, Windows 95 vorhanden waren) wie folgt nutzen:

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

oder

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

Sie können auch den anpassbaren Befehl PopUp wählen. In diesem Beispiel erhalten Sie ein 10-Sekunden-Fenster, in dem Sie vor dem Timeout auf OK klicken:

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

In ihrem obigen Kontext verhalten sich sowohl cscript als auch wscript gleich. Beim Aufruf aus einer Batchdatei halten bot cscript und wscript die Batchdatei an, bis sie ihr Skript beendet haben. Anschließend kann die Datei fortgesetzt werden.

Bei einem manuellen Aufruf über die Eingabeaufforderung gibt cscript die Steuerung nicht an die Eingabeaufforderung zurück, bis sie abgeschlossen ist, während wscript einen separaten Thread für die Ausführung des Skripts erstellt. Die Steuerung wird an die Eingabeaufforderung zurückgegeben, noch bevor das Skript beendet ist.

Andere in diesem Thread behandelte Methoden führen nicht dazu, dass die Ausführung von Batchdateien angehalten wird, während auf das Klicken der Nachricht gewartet wird. Ihre Auswahl wird von Ihren Bedürfnissen bestimmt.

Hinweis: Mit dieser Methode stehen mehrere Tasten- und Symbolkonfigurationen zur Verfügung, um verschiedene Abfragen von yes/no/cancel/abort/retry an den Benutzer abzudecken: https://technet.Microsoft.com/ de-de/library/ee156593.aspx

 enter image description here

19
James K

Ein paar weitere Möglichkeiten (bei allen wartet das Skript anders als bei msg.exe Auf das Drücken eines Buttons).

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 in 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 jsvascript 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 parametrierter .bat/jscript - Hybrid (sollte als bat gespeichert werden). Trotz der OP-Anforderung wird wieder jscript verwendet Da es sich jedoch um eine Fledermaus handelt, kann sie ohne Bedenken als Fledermausdatei bezeichnet werden. Sie verwendet POPUP , wodurch ein wenig mehr Kontrolle möglich ist als die mehr Populae - MSGBOX . 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="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) 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) Obwohl die msg -Lösung bereits als Antwort veröffentlicht wurde, ist hier eine bessere Möglichkeit, sie zu verwenden:

msg * /self /w "hello world"

/self Ist ein nicht dokumentierter Schalter, der die Nachricht nur an den aktuellen Benutzer senden lässt.

16
npocmaka

msg * Hallo Welt

funktioniert bei mir..

4
user3176371

Es ist einfach, eine Nachricht zu machen.

Öffnen Sie zuerst den Notizblock und geben Sie Folgendes ein:

msg "Message",0,"Title"

und speichern Sie es als Message.vbs.

Nun in Ihrem Batch-Dateityp:

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

Diese Methode ist sehr einfach und sollte in jeder Batch-Datei funktionieren, die ich glaube. Der einzige "Nachteil" dieser Methode ist, dass sie nur 1 Nachricht auf einmal anzeigen kann. Wenn mehrere Nachrichten vorhanden sind, werden sie nacheinander angezeigt, abhängig von der Reihenfolge, in der sie in den Code eingefügt werden. Stellen Sie außerdem sicher, dass sich in Ihrer Batchdatei ein anderer Schleifen- oder fortlaufender Operator befindet. Andernfalls wird die Batchdatei automatisch geschlossen und es wird nur diese Meldung angezeigt. Wenn Sie einen "ruhigen" Hintergrund-Loop-Operator benötigen, können Sie Folgendes tun:

pause >nul

Das sollte es weiter laufen lassen, aber dann wird es geschlossen, nachdem eine Taste gedrückt wurde.

Damit alle Befehle während der Ausführung "leise" bleiben, sodass sie nur ausgeführt werden und nicht anzeigen, dass sie in die Datei eingegeben wurden, fügen Sie die folgende Zeile am Anfang der Stapeldatei ein:

@echo off

Ich hoffe alle diese Tipps haben geholfen!

0
Cubit-Games

Am besten verwenden Sie NET SEND, wie auf Rob van der Woudes Site dokumentiert. 

Andernfalls müssen Sie ein externes Skriptprogramm verwenden. Batch-Dateien sind wirklich dazu gedacht, Nachrichten über ECHO zu senden.

0

Dies ist sehr einfach, da ich ein paar Zeilen Code erstellt habe, die dies für Sie tun

Setzen Sie also eine Variable als msg und verwenden Sie diesen Code. es Popup in einem VBS-Meldungsfeld.

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

Dies ist nur etwas, das ich mir ausgedacht habe, sollte für die meisten Ihrer Nachrichtenanforderungen funktionieren, und es funktioniert auch mit Spaces, im Gegensatz zu einigen Batch-Skripts

0
user3674709