Pokaż wyskakujące okienko / okno komunikatu z pliku wsadowego systemu Windows

153

Czy istnieje sposób na wyświetlenie okna komunikatu z pliku wsadowego (podobny do tego, jak xmessagemożna go używać ze skryptów bash w systemie Linux)?

billyy
źródło
CMD.EXE to 32-bitowy procesor poleceń obsługujący polecenia DOS.
Alan B
7
Nazywa się wiersz polecenia systemu Windows.
Ricardo Polo Jaramillo

Odpowiedzi:

121

Zrobiłbym bardzo prosty plik VBScript i wywołałbym go za pomocą CScript do przeanalizowania parametrów wiersza poleceń.

Coś takiego jak następujące zapisane w MessageBox.vbs:

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

Które chcesz nazwać:

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

MsgBoxodniesienie, jeśli jesteś zainteresowany tą trasą.

boflynn
źródło
dzięki, że to zrobię, źle utworzę plik, zapiszesz do niego te dane, a potem go wykorzystasz, niż go usuniesz. powinno działać dobrze :)
billyy
1
Świetna odpowiedź. W ten sposób możesz mieć pełną kontrolę nad ikonami, przyciskami i tytułem pola. Również kiedy zapisujesz plik gdzieś wzdłuż ścieżki PATH, wywołujesz go z dowolnego miejsca. Utworzyłem kilka plików dla alertów z różnymi ikonami.
Deus777,
Miły. BTW, nie musisz używać CScript, przynajmniej w Win10. Dzięki CScript otrzymuję dodatkowy tekst w wierszu polecenia. Bez CScript jest tylko alert, który jest świetny
A Child of God
Nie miałem skryptu. Zamiast tego użyłem startu.
sureshvv
127

Po pierwsze, DOS nie ma z tym nic wspólnego, prawdopodobnie potrzebujesz rozwiązania wiersza poleceń Windows (znowu: bez DOS, czysty Windows, po prostu nie okno, ale konsola).

Możesz użyć metody VBScript dostarczonej przez boflynn lub możesz niewłaściwie użyć net sendlub msg. net senddziała tylko na starszych wersjach okien:

net send localhost Some message to display

Zależy to również od działania usługi Posłaniec.

W przypadku nowszych wersji (najwyraźniej XP i nowszych):

msg "%username%" Some message to display

Należy zauważyć, że wiadomość wysłana za pomocą msg.exebędzie trwała tylko przez 60 sekund. Można to jednak obejść za pomocą /time:xxprzełącznika.

Joey
źródło
2
Możesz użyć zmiennych env, aby pobrać lokalnego użytkownika -% USERNAME%. msg.exe znajduje się na moim komputerze XP Home, ale słyszałem anegdoty, że nie ma go we wszystkich wersjach Visty. Uważam, że usługa NET SEND jest obecnie wyłączona.
McDowell
Dobrze, dziękuję, zapomniałem envvar (rzadko używaj w partiach czegoś poza% UserProfile% i własnymi zdefiniowanymi :)). Zabawne jednak, masz rację co do usługi Posłaniec. Nie istnieje nawet na mojej maszynie wirtualnej XP, ale wysyłanie sieciowe nadal istnieje. Jednak działa tam msg.exe.
Joey
18
Pomyślałem, że w odpowiedziach brakuje realnej opcji i zapewniłem ją. Nie ma tu nic złego. Nie musisz też czuć się zmuszony do zrobienia czegoś, ani nie mówię, że boflynn się myli. Właśnie dodawałem kolejną opcję, która powinna być idealna w przypadku pytań, na które nie ma jednej ostatecznej odpowiedzi. Co więcej, prawdopodobnie nie jesteś jedyny z tym pytaniem, a inni mogą nie chcieć używać VBScript z jakichkolwiek powodów. To jest witryna społeczności, nie tylko twoja :-)
Joey
8
Użyłem tego właśnie do wyświetlenia wiadomości „Kocham cię” na komputerze mojej dziewczyny ze zdalnej powłoki.
Camilo Martin
1
W Windows 8 i 10 znalazłem wersję Windowsa się liczy. U mnie działa na pro, ale nie w domu. Inni zgłosili, że działa na Home Premium i Enterprise, Ultimate itp. Wydaje się, że zwykły stary dom go nie ma (nie istnieje w System32, ale można go dodać).
shox
84

Może trochę migać, ale nie są wymagane żadne pliki tymczasowe. Powinien działać aż do miejsca w erze IE5 (IIRC).

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

Nie zapomnij uciec od nawiasów, jeśli używasz if:

if 1 == 1 (
   mshta javascript:alert^("1 is equal to 1, amazing."^);close^(^);
)
Ptactwo
źródło
Działa to doskonale z wiersza polecenia, ale kiedy trzymać go w pliku wsadowym, otrzymuję ten błąd: close() was unexpected at this time.
eye_mew
@eye_mew może musisz usunąć te ^znaki ucieczki z pliku nietoperza
phuclv
1
U mnie zadziałało idealnie z pliku wsadowego (pracuję na Windows 7) Czy w ten sposób możemy uruchomić jakikolwiek Javascript? Jak zwrócilibyśmy wartości do pliku wsadowego?
Jerry Jeremiah
1
Oto niektóre niesamowite przykłady rzeczy, które możesz zrobić: dostips.com/forum/viewtopic.php?t=5311 W LocalDateTime przykład zwraca wartość. Dzięki za pomysł!
Jerry Jeremiah
Fajny node.js firmy Microsoft przed JavaScriptem po stronie serwera był fajny - stracona szansa dla nich.
Daniel Sokolowski
76

Spowoduje to wyświetlenie kolejnego okna wiersza polecenia:

START CMD /C "ECHO My Popup Message && PAUSE"
Dave Webb
źródło
1
niesamowity ty! mógłbym użyć tego w kilku innych skryptach :)
billyy
3
Lepszą opcją byłoby: start cmd /c "@echo off & mode con cols=18 lines=2 & echo My Popup Message & pause>nul"zmień cols=18na ilość znaków w wiadomości + 2. I lines=2niezależnie od liczby linii wynosi + 1.
ender_scythe
1
pozbyć się PAUZY i użyćcmd /k
Artelius
34

Próbować :

Msg * "insert your message here" 

Jeśli używasz command.com systemu Windows XP, spowoduje to otwarcie okna komunikatu.

Rozumiem, że otwarcie nowego okna cmd nie jest tym, o co prosiłeś. Możesz także użyć VBScript i użyć go z plikiem .bat. Otworzyłbyś go z pliku bat za pomocą tego polecenia:

cd C:\"location of vbscript"

To powoduje zmianę katalogu, w którym command.com wyszuka pliki, a następnie w następnym wierszu:

"insert name of your vbscript here".vbs

Następnie utwórz nowy dokument Notatnika , wpisz

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

Następnie zapisz to jako plik .vbs (umieszczając „.vbs” na końcu nazwy pliku), zapisz jako „Wszystkie pliki” w rozwijanym polu poniżej nazwy pliku (więc nie zostanie zapisany jako .txt ), a następnie kliknij Zapisz!

Unihedron
źródło
3
Nie potrzebujesz <script/>tagu.
surfasb
? jak wstawić nową linię (puste linie) w tekście używając -> MSG * <tekst>
ZEE
@ZEE Jeśli użyjesz tylko msg *, zostaniesz poproszony o wpisanie wiadomości, a następnie ctrl-Z. W tym miejscu możesz wprowadzić podziały wierszy, które pojawią się w wiadomości.
User5910,
30

Kilka innych sposobów.

1) Najgłupszy i najbardziej hacki - używa IEXPRESS do stworzenia małego pliku exe, który utworzy wyskakujące okienko za pomocą jednego przycisku ( może utworzyć dwa dodatkowe typy wyskakujących wiadomości ). Działa na WSZYSTKICH oknach od XP i wyższych:

;@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) Korzystanie MSHTA. Działa również na każdym komputerze z systemem Windows od XP i nowszych (pomimo tego, że OP nie chcą języków „zewnętrznych”, JavaScript jest tutaj zminimalizowany). Należy zapisać jako .bat:

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

alert("Hello, world!");

lub w jednej linii:

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

lub

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

lub

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

3) Tutaj sparametryzowana .bat/jscripthybryda (należy zapisać jako bat). Ponownie używa JavaScript pomimo żądania OP, ale ponieważ jest to nietoperz, można go bez obaw nazwać plikiem bat. Używa POPUP, który pozwala na nieco większą kontrolę niż bardziej popularny MSGBOX . Używa WSH, ale nie MSHTA, jak w powyższym przykładzie.

 @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) i jedną jscript.net/.bathybrydę (należy zapisać jako .bat), tym razem wykorzystuje .NETi kompiluje mały .exeplik, który można usunąć:

@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), a na końcu jedno wywołanie programu PowerShell, które tworzy wyskakujące okienko (można wywołać z wiersza poleceń lub z partii, jeśli zainstalowano PowerShell):

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

6) I podejście dbenham widziane tutaj

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

7 ) W przypadku powiadomień w zasobniku systemowym możesz spróbować tego :

call SystemTrayNotification.bat  -tooltip warning -time 3000 -title "Woow" -text "Boom" -icon question
npocmaka
źródło
29

W ten sposób plik wsadowy utworzy skrypt VBS i wyświetli wyskakujące okienko. Po uruchomieniu plik wsadowy usunie ten plik pośredni.

Zaletą korzystania z MSGBOX jest to, że można go naprawdę dostosować (zmienić tytuł, ikonę itp.), Podczas gdy MSG.exe nie jest tak duży.

echo MSGBOX "YOUR MESSAGE" > %temp%\TEMPmessage.vbs
call %temp%\TEMPmessage.vbs
del %temp%\TEMPmessage.vbs /f /q
dc1
źródło
15

Oto wariant PowerShell, który nie wymaga ładowania zestawów przed utworzeniem okna, jednak działa zauważalnie wolniej (~ + 50%) niż polecenie PowerShell MessageBox opublikowane tutaj przez @npocmaka:

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

Możesz zmienić ostatni parametr z „0x0” na wartość poniżej, aby wyświetlić ikony w oknie dialogowym (więcej informacji w sekcji Metoda wyskakującego okienka ):

        Zatrzymać0x10 Stop
        Znak zapytania0x20 Znak zapytania
        Wykrzyknik0x30 Wykrzyknik
        Znak informacyjny0x40 Znak informacyjny

Na podstawie artykułu Microsoft TechNet PowerTip: Użyj programu PowerShell, aby wyświetlić wyskakujące okienko .

Użytkownik5910
źródło
10
echo X=MsgBox("Message Description",0+16,"Title") >msg.vbs

- możesz wpisać dowolne liczby od 0,1,2,3,4 zamiast 0 (przed symbolem „+”) i tutaj jest znaczenie każdej liczby:

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

- możesz wpisać dowolne liczby od 16,32,48,64 zamiast 16 (po symbolu „+”) i tutaj jest znaczenie każdej liczby:

16 – Critical Icon  
32 – Warning Icon  
48 – Warning Message Icon   
64 – Information Icon  
p2013
źródło
2
Jak otrzymujesz odpowiedź ze skryptu VB?
Suit Boy Apps
7

Msg * "tu wstaw swoją wiadomość"

działa dobrze, po prostu zapisz jako plik .bat w notatniku lub upewnij się, że format jest ustawiony na „wszystkie pliki”

Max Runacres
źródło
Dokumenty mówią, że „*” spowoduje „Wysłanie wiadomości do wszystkich sesji na określonym serwerze”, tj. przerwie usługi terminalowe lub szybkie przełączanie użytkowników
Fowl
2
możesz użyćmsg %SESSIONNAME% msg
Fowl
5
msg * /time:0 /w Hello everybody!

Ta wiadomość czeka wiecznie, aż klikniesz OK (domyślnie trwa tylko minutę) i działa dobrze w Windows 8.1

MoE bis
źródło
Ta sama odpowiedź jest obecna od 2009 roku
jeb
Ups> _ <Usuń to :)
MoE do
? jak wstawić nową linię (puste linie) w tekście
ZEE
3
msg * /time:0 /w <C:\Somewhere\Message.txtgdzie w pliku jest zwykły tekst (zawierający CrLf).
MoE bis
4

Aby to zrobić, musisz mieć mały program, który wyświetla skrzynkę komunikatów i uruchamia go z pliku wsadowego.

Możesz otworzyć okno konsoli, które wyświetla monit, ale wyświetlenie okna komunikatu GUI za pomocą cmd.exe i tylko znajomych nie jest możliwe, AFAIK.

Macke
źródło
podpowiedź może to zrobić ... czy masz więcej na ten temat?
billyy
1
echo "xx", pauza lub set / p var = prompt to opcje cmd.exe
Macke
@ nickl-: lepiej w ten sposób?
Macke,
3

Używam narzędzia o nazwie msgbox.exe stąd: http://www.paulsadowski.com/WSH/cmdprogs.htm

zhongshu
źródło
Według programu antywirusowego firmy Symantec to archiwum zawiera trojana.
David
3
@David - otrzymałem pliki wsadowe i tekstowe oznaczone jako wrogie przez programy antywirusowe. W rzeczywistości program antywirusowy AVG przechwycił instrukcję wiersza poleceń i stwierdził, że był to wirus.
James K,
2
FWIW Virus Total mówi, że programy do sprawdzania wirusów 11/51 wykrywają wirusy w tym pliku: virustotal.com/en/file/ ...
Matthew Lock,
3

Możesz użyć Zenity . Zenity pozwala na wykonywanie okien dialogowych w wierszach poleceń i skryptach powłoki. Więcej informacji można znaleźć również w Wikipedii .

Jest wieloplatformowy: instalator systemu Windows dla systemu Windows można znaleźć tutaj .

parvus
źródło
3

Podążając za odpowiedzią @ Fowl, możesz ją poprawić, ustawiając limit czasu, aby pojawiał się tylko przez 10 sekund, używając:

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

Więcej informacji znajdziesz tutaj .

Rafi
źródło
Wykryty jako wirus xD
Julien
2

Możesz wywołać funkcję dll z user32.dll Myślę, że coś takiego

Rundll32.exe user32.dll, MessageBox (0, "text", "titleText", {dodatkowe flagi dla górnej skrzynki wiadomości itp.})

Pisząc to z mojego telefonu, nie oceniaj mnie ... w przeciwnym razie połączyłbym dodatkowe flagi.

Entropia
źródło
Mogę rundll32.exe user32.dll,MessageBoxA Xwyświetlić skrzynkę wiadomości z X jako tytułem, gdy robię to w polu Uruchom. Bez względu na to, jakim X jest, nie mogę go interpretować jako wielu parametrów - wszystko trafia do tytułu. Więc rundll32.exe user32.dll,MessageBoxA (0, "MyTitle", "MyText", 0)wyświetla okno wiadomości z tytułem (0, "MyTitle", "MyText", 0) Ale nie mogę zmusić go do działania W CAŁOŚCI z wiersza poleceń - tylko z pola Uruchom. W linii poleceń w ogóle nic nie robi. Czy na pewno działa z wiersza poleceń lub z pliku wsadowego, czy tylko z pola Uruchom?
Jerry Jeremiah
rundll32.exe zgodnie z dokumentem może uruchamiać tylko te procedury, które zostały specjalnie zaprojektowane do tego celu, ponieważ muszą one przeanalizować część „argumenty opcjonalne”. Funkcje MessageBox nie zostały zaprojektowane w ten sposób. Dlaczego to działa przez Win + R (Run box), to wciąż duże pytanie!
Yuriy Pozniak
1

msg * /server:127.0.0.1 Wpisz tutaj swoją wiadomość

Franco
źródło
Windows cmd.exe mówi: „msg” nie jest rozpoznawany jako polecenie wewnętrzne lub zewnętrzne, program operacyjny lub plik wsadowy.
Anthony Hatzopoulos,
@AnthonyHatzopoulos, ponieważ jest obsługiwany tylko w XP
pattyd
@pattyd XP, a właściwie później
Jesan Fafon
@JesanFafon nie, został wycofany po XP ... Myślę, że masz na myśli XP i wcześniejsze
pattyd
@pattyd W systemie Windows 8.1 where msgzwraca C:\Windows\System32\msg.exe. Myślę, że myślisz onet send
Jesan Fafon
1

Ta aplikacja może to zrobić, jeśli konwertujesz (zawijasz) pliki wsadowe do plików wykonywalnych.


  1. Prosta skrzynka wiadomości

    %extd% /messagebox Title Text
    

  1. Komunikat o błędzie

    %extd% /messagebox  Error "Error message" 16
    
  2. Anuluj pole wiadomości Spróbuj ponownie

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

4) Skrzynka wiadomości „Nigdy więcej nie pytaj”

%extd% /messageboxcheck Title Message 0 {73E8105A-7AD2-4335-B694-94F837A38E79}
ktoś23432
źródło
0

Lepsza opcja

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


Opis:
lines= liczba wierszy plus 1
cols= liczba znaków w wiadomości plus 3 (przy czym minimum musi wynosić15 )

colsWersja obliczana automatycznie :

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
źródło
@ender_scythe komentarz działa ( start cmd /c "@echo off & mode con cols=18 lines=2 & echo My Popup Message & pause>nul"). Twój nie. Powtarza komunikat, ale nie ustawia rozmiaru okna, zwracając The screen cannot be set to the number of lines and columns specified.przynajmniej w moim systemie Windows 7.
cdlvcdlv
@cdlvcdlv Zaktualizowałem odpowiedź. powinien teraz działać dla wszystkich, zrewiduj go.
T.Todua
To rzeczywiście działa ... pod warunkiem, że xw bieżącym katalogu nie ma pliku o nazwie lub nie masz nic przeciwko jego utracie.
cdlvcdlv
Wziąłeś doskonale działający komentarz i złamałeś go. Potem próbowałeś dodać jakąś wartość (przyznaję), ale za cenę utraty dowolnego pliku o niezbyt nieprawdopodobnej nazwie. Jeśli ktoś (z ciekawości) spróbuje twojego kodu z takim pechem, to na dobre straci plik. Ponadto, jeśli istnieje folder o nazwie x, polecenie po prostu się nie powiedzie. Nie dziękuj mi i popraw kod. Nie musisz nawet używać jednej linijki. A jeśli uważasz, że Twój kod jest tak dobry, opublikuj go w Przeglądzie kodu .
cdlvcdlv
co za niewdzięczność ... Nie złamałem się, ale zaktualizowałem, wyjaśniłem, a nawet podałem automatyczne rozwiązanie ... (ale są ludzie tacy jak ty, których nie mogę zadowolić). powodzenia
T.Todua
0

Oto mój skrypt wsadowy, który stworzyłem na podstawie dobrych odpowiedzi tutaj i innych postów

Możesz ustawić limit czasu tytułu, a nawet uśpić, aby zaplanować go na później & \ n dla nowej linii

Nazwij go popup.bat i umieść w folderze ścieżki systemu Windows, aby działał globalnie na twoim komputerze

Na przykład popup Line 1\nLine 2wyświetli 2-wierszowe okienko wyskakujące (typpopup /? do użycia)

Oto kod

<!-- : 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
źródło
-3

musi wyświetlać wyskakujące okienko TYLKO wewnątrz maszyny wirtualnej, więc technicznie rzecz biorąc, powinien być kod taki jak:

if %machine_type% == virtual_machine then
   echo message box code
else
   continue normal installation code
Nielegalny obcy
źródło
głosuj negatywnie, ponieważ instalacja nie będzie kontynuowana, jeśli (% machine_type% == virtual_machine) == true
anion