Czy istnieje sposób na wyświetlenie okna komunikatu z pliku wsadowego (podobny do tego, jak xmessage
można go używać ze skryptów bash w systemie Linux)?
Czy istnieje sposób na wyświetlenie okna komunikatu z pliku wsadowego (podobny do tego, jak xmessage
można go używać ze skryptów bash w systemie Linux)?
Odpowiedzi:
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."
MsgBox
odniesienie, jeśli jesteś zainteresowany tą trasą.
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 send
lub msg
. net send
dział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.exe
będzie trwała tylko przez 60 sekund. Można to jednak obejść za pomocą /time:xx
przełącznika.
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^(^);
)
close() was unexpected at this time
.
^
znaki ucieczki z pliku nietoperza
Spowoduje to wyświetlenie kolejnego okna wiersza polecenia:
START CMD /C "ECHO My Popup Message && PAUSE"
start cmd /c "@echo off & mode con cols=18 lines=2 & echo My Popup Message & pause>nul"
zmień cols=18
na ilość znaków w wiadomości + 2. I lines=2
niezależnie od liczby linii wynosi + 1.
cmd /k
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!
<script/>
tagu.
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.
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/jscript
hybryda (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/.bat
hybrydę (należy zapisać jako .bat
), tym razem wykorzystuje .NET
i kompiluje mały .exe
plik, 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
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
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 ):
0x10 Stop
0x20 Znak zapytania
0x30 Wykrzyknik
0x40 Znak informacyjny
Na podstawie artykułu Microsoft TechNet PowerTip: Użyj programu PowerShell, aby wyświetlić wyskakujące okienko .
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
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”
msg %SESSIONNAME% msg
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
msg * /time:0 /w <C:\Somewhere\Message.txt
gdzie w pliku jest zwykły tekst (zawierający CrLf).
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.
Używam narzędzia o nazwie msgbox.exe stąd: http://www.paulsadowski.com/WSH/cmdprogs.htm
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 .
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.
rundll32.exe user32.dll,MessageBoxA X
wyś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?
msg * /server:127.0.0.1 Wpisz tutaj swoją wiadomość
where msg
zwraca C:\Windows\System32\msg.exe
. Myślę, że myślisz onet send
Ta aplikacja może to zrobić, jeśli konwertujesz (zawijasz) pliki wsadowe do plików wykonywalnych.
Prosta skrzynka wiadomości
%extd% /messagebox Title Text
Komunikat o błędzie
%extd% /messagebox Error "Error message" 16
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}
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
)
cols
Wersja 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"
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.
x
w bieżącym katalogu nie ma pliku o nazwie lub nie masz nic przeciwko jego utracie.
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 .
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 2
wyś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>
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