แสดงป๊อปอัพ / กล่องข้อความจากไฟล์แบตช์ของ Windows


153

มีวิธีการแสดงกล่องข้อความจากแฟ้มแบตช์ (คล้ายกับวิธีการxmessageใช้จาก bash-script ใน Linux)?


CMD.EXE เป็นโปรเซสเซอร์คำสั่ง 32 บิตที่รองรับคำสั่ง DOS
Alan B

7
มันเรียกว่าพรอมต์คำสั่งของ Windows
Ricardo Polo Jaramillo

คำตอบ:


121

ฉันจะสร้างไฟล์ VBScript ที่ง่ายมากและเรียกมันโดยใช้ CScript เพื่อแยกพารามิเตอร์บรรทัดคำสั่ง

บางอย่างเช่นที่บันทึกไว้ในMessageBox.vbs:

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

ซึ่งคุณจะชอบ:

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

MsgBoxอ้างอิงถ้าคุณสนใจที่จะไปเส้นทางนี้


ขอบคุณที่จะทำมันไม่ดีสร้างไฟล์เขียนข้อมูลนี้และกว่าใช้มันกว่าลบ ควรปรับการทำงาน :)
billyy

1
คำตอบที่ดี วิธีนี้คุณสามารถควบคุมไอคอนปุ่มและชื่อกล่องทั้งหมดได้ นอกจากนี้เมื่อคุณบันทึกไฟล์ของคุณไว้ที่ PATH คุณสามารถเรียกไฟล์ได้จากทุกที่ ฉันสร้างไฟล์ไม่กี่ไฟล์สำหรับการแจ้งเตือนด้วยไอคอนที่แตกต่างกัน
Deus777

ดี BTW คุณไม่จำเป็นต้องใช้ CScript อย่างน้อยใน Win10 ด้วย CScript ฉันได้รับข้อความเพิ่มเติมใน Command Prompt หากไม่มี CScript จะมีเพียงการแจ้งเตือนซึ่งยอดเยี่ยม
บุตรของพระเจ้า

ฉันไม่มี cscript ฉันใช้การเริ่มต้นแทน
sureshvv

127

ก่อนอื่น DOS ไม่มีส่วนเกี่ยวข้องคุณอาจต้องการโซลูชันบรรทัดคำสั่งของ Windows (อีกครั้ง: ไม่มี DOS, Windows บริสุทธิ์ไม่ใช่เพียงหน้าต่าง แต่เป็นคอนโซล)

คุณสามารถใช้วิธีการ VBScript ให้โดย boflynn หรือคุณสามารถผิดพลาดการใช้งานหรือ net send ใช้งานได้กับ Windows รุ่นเก่าเท่านั้น:msgnet send

net send localhost Some message to display

สิ่งนี้ขึ้นอยู่กับบริการ Messenger ที่จะใช้งาน

สำหรับรุ่นที่ใหม่กว่า (XP และใหม่กว่า):

msg "%username%" Some message to display

ควรสังเกตว่ากล่องข้อความที่ส่งโดยใช้msg.exeจะมีอายุการใช้งาน 60 วินาทีเท่านั้น อย่างไรก็ตามสิ่งนี้สามารถแทนที่ได้ด้วย/time:xxสวิตช์


2
คุณสามารถใช้ตัวแปร env เพื่อรับผู้ใช้ท้องถิ่น -% USERNAME% msg.exe อยู่ในเครื่อง XP Home ของฉัน แต่ฉันเคยได้ยินบัญชีที่บอกว่ามันไม่ได้อยู่ใน Vista ทุกรุ่น ฉันเชื่อว่าบริการที่อยู่เบื้องหลังการส่ง NET ถูกปิดใช้งานในวันนี้
McDowell

ถูกต้องขอบคุณลืม envvar (ไม่ค่อยใช้อะไรเกิน% UserProfile% และคนที่ฉันกำหนดไว้เป็นแบทช์ :)) ตลก แต่คุณพูดถูกเกี่ยวกับบริการ Messenger มันไม่ได้มีอยู่บน XP VM ของฉัน แต่การส่งสุทธิยังคงมีอยู่ แม้ว่า msg.exe จะทำงานที่นั่น
Joey

18
ฉันคิดว่าตัวเลือกที่ทำงานได้หายไปจากคำตอบและให้มา ไม่มีอะไรผิดปกติที่นี่ คุณไม่จำเป็นต้องรู้สึกถูกบังคับให้ทำอะไรหรืออย่างใดฉันก็บอกว่ามันผิด boflynn ฉันเพิ่งเพิ่มตัวเลือกอื่นซึ่งน่าจะดีสำหรับคำถามที่ไม่มีคำตอบที่ชัดเจน นอกจากนี้คุณอาจไม่ใช่คนเดียวที่มีคำถามนี้และคนอื่น ๆ อาจไม่ต้องการใช้ VBScript ด้วยเหตุผลใดก็ตาม นี่เป็นไซต์ชุมชนไม่ใช่ของคุณเพียงคนเดียว :-)
Joey

8
ฉันเพื่อตัวเองใช้สิ่งนี้เพื่อวางไข่ข้อความ "ฉันรักคุณ" บนพีซีแฟนสาวของฉันจากเปลือกระยะไกล
Camilo Martin

1
ใน Windows 8 และ 10 ฉันพบว่า Windows มีความสำคัญ สำหรับฉันมันใช้งานได้ดี แต่ไม่ใช่บ้าน คนอื่น ๆ รายงานว่ามันใช้งานได้กับ Home Premium และ Enterprise, Ultimate ฯลฯ ดูเหมือนว่าบ้านเก่าจะไม่ได้รับมัน (ไม่มีอยู่ใน System32 แต่สามารถเพิ่มได้)
shox

84

อาจแสดงแฟลชเพียงเล็กน้อย แต่ไม่จำเป็นต้องใช้ไฟล์ชั่วคราว ควรทำงานกลับไปสู่ที่ไหนสักแห่งในยุค (IIRC) IE5

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

อย่าลืมที่จะหลีกเลี่ยงวงเล็บถ้าคุณใช้if:

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

นี้ทำงานได้อย่างสมบูรณ์แบบจากคำสั่งพรอมต์ close() was unexpected at this timeแต่เมื่อฉันติดไว้ในแฟ้มชุดที่ผมได้รับข้อผิดพลาดนี้:
eye_mew

@eye_mew บางทีคุณอาจต้องการที่จะลบที่^ตัวหนีในไฟล์ค้างคาว
phuclv

1
มันทำงานได้อย่างสมบูรณ์แบบสำหรับฉันจากไฟล์แบตช์ (ฉันใช้ Windows 7) เราสามารถเรียกใช้ Javascript ด้วยวิธีนี้ได้หรือไม่? เราจะคืนค่าไปยังไฟล์แบตช์ได้อย่างไร
Jerry Jeremiah

1
นี่คือตัวอย่างที่น่าตื่นตาตื่นใจของสิ่งที่คุณสามารถทำได้: dostips.com/forum/viewtopic.php?t=5311 ตัวอย่าง LocalDateTime ส่งกลับค่า ขอบคุณสำหรับความคิด!
Jerry Jeremiah

เด็ด node.js โดย Microsoft ก่อน JavaScript ฝั่งเซิร์ฟเวอร์ก็เจ๋ง - โอกาสพลาดสำหรับพวกเขา
Daniel Sokolowski

76

นี่จะป็อปอัพหน้าต่างพรอมต์คำสั่งอื่น:

START CMD /C "ECHO My Popup Message && PAUSE"

1
เจ๋งมาก! ฉันอาจใช้วิธีนี้ในสคริปต์อื่น ๆ ไม่กี่ :)
billyy

3
ตัวเลือกที่ดีกว่าคือ: start cmd /c "@echo off & mode con cols=18 lines=2 & echo My Popup Message & pause>nul"เปลี่ยนcols=18จำนวนตัวอักษรในข้อความ + 2 และlines=2จำนวนใดก็ตามที่มีจำนวนบรรทัดเท่ากับ + 1
ender_scythe

1
กำจัด PAUSE และใช้งานcmd /k
Artelius

34

ลอง :

Msg * "insert your message here" 

หากคุณใช้คอมมิชชันของ Windows XP สิ่งนี้จะเปิดกล่องข้อความ

การเปิดหน้าต่าง cmd ใหม่ไม่ใช่สิ่งที่คุณต้องการ คุณสามารถใช้VBScriptและใช้สิ่งนี้กับไฟล์. bat ของคุณ คุณจะเปิดมันจากไฟล์ค้างคาวด้วยคำสั่งนี้:

cd C:\"location of vbscript"

สิ่งนี้ทำการเปลี่ยนแปลงไดเร็กตอรี่ command.com จะค้นหาไฟล์จากนั้นในบรรทัดถัดไป

"insert name of your vbscript here".vbs

จากนั้นคุณสร้างใหม่ เอกสารNotepadให้พิมพ์

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

จากนั้นคุณจะบันทึกเป็นไฟล์. vbs (โดยใส่ ".vbs" ที่ท้ายชื่อไฟล์) บันทึกเป็น "All Files" ในช่องแบบเลื่อนลงใต้ชื่อไฟล์ (ดังนั้นจึงไม่บันทึกเป็น. txt ) จากนั้นคลิกบันทึก!


3
คุณไม่ต้องการ<script/>แท็ก
surfasb

วิธีแทรกบรรทัดใหม่ (บรรทัดว่าง) ในข้อความเมื่อใช้ -> MSG * <text>
ZEE

@ZEE หากคุณใช้เพียงmsg *คุณจะได้รับแจ้งให้ป้อนข้อความตามด้วย ctrl-Z คุณสามารถป้อนตัวแบ่งบรรทัดที่นี่ซึ่งจะปรากฏในข้อความของคุณ
User5910

30

อีกไม่กี่วิธี

1)คนที่บ้าที่สุดและแฮ็คที่สุด - มันใช้ IEXPRESS เพื่อสร้าง exe ขนาดเล็กที่จะสร้างป๊อปอัพด้วยปุ่มเดียว ( มันสามารถสร้างข้อความป๊อปอัพอีกสองประเภท ) ใช้งานได้กับทุกหน้าต่างจาก 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)MSHTAการใช้ ยังทำงานได้กับทุกเครื่อง windows จาก XP และสูงกว่า (แม้ OP ไม่ต้องการภาษา "ภายนอก" JavaScript ที่นี่จะย่อเล็กสุด) ควรบันทึกเป็น.bat:

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

alert("Hello, world!");

หรือในหนึ่งบรรทัด:

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

หรือ

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

หรือ

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

3).bat/jscriptไฮบริดของพารามิเตอร์นี่คือ(ควรบันทึกเป็นbat) มันใช้จาวาสคริปต์อีกครั้งแม้จะมีคำขอ OP แต่มันก็เป็นค้างคาวจึงสามารถเรียกได้ว่าเป็นไฟล์ค้างคาวโดยไม่ต้องกังวล มันใช้POPUPซึ่งจะช่วยให้การควบคุมนิด ๆ หน่อย ๆ มากขึ้นกว่าที่เป็นที่นิยมมากขึ้นMsgBox มันใช้ WSH แต่ไม่ใช่ MSHTA เหมือนในตัวอย่างด้านบน

 @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)และjscript.net/.batไฮบริดหนึ่งตัว (ควรได้รับการบันทึกเป็น.bat) คราวนี้มันใช้.NETและรวบรวม.exeไฟล์ขนาดเล็กที่สามารถลบได้:

@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)และในตอนท้ายการเรียกหนึ่งครั้งไปยัง powershell ที่สร้างป๊อปอัพ (สามารถเรียกได้จากบรรทัดคำสั่งหรือจากชุดงานหากติดตั้ง powershell):

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

6)และวิธีการของ dbenham เห็นที่นี่

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

7 ) สำหรับการแจ้งเตือนถาดระบบคุณสามารถลองนี้ :

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

29

วิธีนี้แบตช์ไฟล์ของคุณจะสร้างสคริปต์ VBS และแสดงป๊อปอัพ หลังจากทำงานไฟล์แบตช์จะลบไฟล์ระดับกลางนั้น

ข้อดีของการใช้ MSGBOX คือสามารถปรับแต่งได้เอง (เปลี่ยนชื่อไอคอน ฯลฯ ) ในขณะที่ MSG.exe นั้นไม่มาก

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

15

นี่คือตัวแปร PowerShell ที่ไม่ต้องการโหลดชุดประกอบก่อนที่จะสร้างหน้าต่างอย่างไรก็ตามมันทำงานช้าลงอย่างเห็นได้ชัด (~ + 50%) กว่าคำสั่ง PowerShell MessageBox ที่โพสต์ที่นี่โดย @npocmaka:

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

คุณสามารถเปลี่ยนพารามิเตอร์สุดท้ายจาก "0x0" เป็นค่าด้านล่างเพื่อแสดงไอคอนในกล่องโต้ตอบ (ดูวิธีการป๊อปอัพสำหรับการอ้างอิงเพิ่มเติม):

        หยุด0x10 หยุด
        เครื่องหมายคำถาม0x20 เครื่องหมายคำถาม
        เครื่องหมายตกใจ0x30 เครื่องหมายอัศเจรีย์
        เครื่องหมายข้อมูล0x40 เครื่องหมายข้อมูล

ที่ดัดแปลงมาจากบทความของ Microsoft TechNet PowerTip: ใช้ PowerShell เพื่อแสดง Pop-Up หน้าต่าง


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

- คุณสามารถเขียนตัวเลขใด ๆ จาก 0,1,2,3,4 แทน 0 (ก่อนสัญลักษณ์ '+') และนี่คือความหมายของแต่ละหมายเลข:

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

- คุณสามารถเขียนตัวเลขใด ๆ จาก 16,32,48,64 แทน 16 (หลังจากสัญลักษณ์ '+') และนี่คือความหมายของแต่ละหมายเลข:

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

2
คุณจะได้รับการตอบสนองจากสคริปต์ VB ได้อย่างไร?
Suit Boy Apps

7

ข่าวสารเกี่ยวกับ * "แทรกข้อความของคุณที่นี่"

ทำงานได้ดีเพียงบันทึกเป็นไฟล์. bat ในแผ่นจดบันทึกหรือตรวจสอบให้แน่ใจว่ารูปแบบถูกตั้งค่าเป็น "ไฟล์ทั้งหมด"


เอกสารบอกว่า "*" จะ "ส่งข้อความไปยังทุกเซสชันบนเซิร์ฟเวอร์ที่ระบุ" เช่น จะทำลายในสถานีบริการหรือการสลับผู้ใช้อย่างรวดเร็ว
ไก่

2
คุณสามารถใช้msg %SESSIONNAME% msg
Fowl

5
msg * /time:0 /w Hello everybody!

ข้อความนี้จะรอตลอดไปจนกว่าจะคลิกตกลง (จะใช้เวลาเพียงหนึ่งนาทีโดยค่าเริ่มต้น) และทำงานได้ดีใน Windows 8.1


คำตอบเดียวกันนี้มีอยู่ตั้งแต่ 2009
jeb

อ๊ะ> _ <โปรดลบ :)
MoE bis

วิธีแทรกบรรทัดใหม่ (บรรทัดว่าง) ในข้อความ
ZEE

3
msg * /time:0 /w <C:\Somewhere\Message.txtโดยที่ในไฟล์เป็นข้อความปกติ (มี CrLf's)
MoE bis

4

ในการทำเช่นนี้คุณต้องมีโปรแกรมขนาดเล็กที่แสดงกล่องข้อความและเรียกใช้จากไฟล์แบตช์ของคุณ

คุณสามารถเปิดหน้าต่างคอนโซลที่แสดงพรอมต์ แต่การรับกล่องข้อความ GUI โดยใช้ cmd.exe และเพื่อน ๆ เป็นไปไม่ได้เลย AFAIK


ข้อความแจ้งอาจทำ ... คุณมีมากกว่านั้นหรือไม่
billyy

1
echo "xx" หยุดชั่วคราวหรือชุด / p var = พร้อมท์เป็นตัวเลือกที่ cmd.exe
Macke

@ nickl-: วิธีนี้ดีกว่าเหรอ?
Macke

3

ฉันใช้ยูทิลิตีชื่อ msgbox.exe จากที่นี่: http://www.paulsadowski.com/WSH/cmdprogs.htm


อ้างอิงจากโปรแกรมป้องกันไวรัสของไซแมนเทคไฟล์เก็บถาวรนี้มีโทรจัน
เดวิด

3
@David - ฉันมีแบทช์และไฟล์ข้อความถูกตั้งค่าสถานะเป็นศัตรูโดยโปรแกรมป้องกันไวรัส ในความเป็นจริงฉันมีโปรแกรมป้องกันไวรัส AVG ตรวจจับคำสั่งบรรทัดคำสั่งและอ้างว่าเป็นไวรัส
James K

2
FWIW Virus Total กล่าวว่าตัวตรวจจับไวรัส 11/51 ตรวจจับไวรัสในไฟล์นั้น: virustotal.com/th/file/…
Matthew Lock

3

คุณสามารถใช้Zenity Zenity ช่วยให้การดำเนินการของกล่องโต้ตอบในบรรทัดคำสั่งและสคริปต์เปลือก ข้อมูลเพิ่มเติมนอกจากนี้ยังสามารถพบได้ในวิกิพีเดีย

มันเป็นข้ามแพลตฟอร์ม: ติดตั้ง Windows สำหรับ Windows สามารถพบได้ที่นี่


3

การติดตามคำตอบของ @ Fowl คุณสามารถปรับปรุงได้ด้วยการหมดเวลาเพื่อให้ปรากฏเป็นเวลา 10 วินาทีโดยใช้สิ่งต่อไปนี้:

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

ดูที่นี่สำหรับรายละเอียดเพิ่มเติม


ตรวจพบว่าเป็นไวรัส xD
Julien

2

คุณสามารถเรียกใช้ฟังก์ชั่น dll จาก user32.dll ฉันคิดว่าบางสิ่งบางอย่างเช่น

Rundll32.exe user32.dll, MessageBox (0, "text", "titleText", {แฟล็กพิเศษสำหรับเช่น messagebox สูงสุด ฯลฯ })

พิมพ์จากโทรศัพท์ของฉันอย่าตัดสินฉัน ... มิฉะนั้นฉันจะเชื่อมโยงธงพิเศษ


ฉันสามารถrundll32.exe user32.dll,MessageBoxA Xแสดงกล่องข้อความด้วย X เป็นชื่อเมื่อฉันทำในกล่องเรียกใช้ ไม่ว่าฉันจะทำ X อย่างไรฉันไม่สามารถตีความมันเป็นพารามิเตอร์หลายตัวได้ ดังนั้นrundll32.exe user32.dll,MessageBoxA (0, "MyTitle", "MyText", 0)แสดงกล่องข้อความที่มีชื่อของ(0, "MyTitle", "MyText", 0) แต่ฉันไม่สามารถทำให้มันทำงานได้ทั้งหมดจากบรรทัดคำสั่ง - เฉพาะจากกล่อง Run ในบรรทัดคำสั่งมันไม่ทำอะไรเลย มันใช้งานได้อย่างแน่นอนจากบรรทัดคำสั่งหรือจากไฟล์แบตช์หรือจากกล่อง Run เท่านั้น
Jerry Jeremiah

rundll32.exe ตามเอกสารสามารถเรียกใช้เฉพาะขั้นตอนเหล่านั้นที่ได้รับการออกแบบมาโดยเฉพาะสำหรับวัตถุประสงค์นี้เพราะพวกเขาจะต้องแยกส่วน "อาร์กิวเมนต์ตัวเลือก" ฟังก์ชัน MessageBox-ish ไม่ได้ถูกออกแบบด้วยวิธีนี้ ทำไมมันถึงทำงานผ่าน Win + R (กล่อง Run) มันยังคงเป็นคำถามใหญ่!
Yuriy Pozniak

1

msg * /server:127.0.0.1 พิมพ์ข้อความของคุณที่นี่


Windows cmd.exe บอกว่า: 'msg' ไม่ได้รับการยอมรับว่าเป็นคำสั่งภายในหรือภายนอก, โปรแกรมที่ทำงานได้หรือไฟล์แบตช์
Anthony Hatzopoulos

@AnthonyHatzopoulos นั่นเป็นเพราะมันรองรับเฉพาะใน XP
Pattyd

@pattyd XP และต่อมาจริงๆแล้ว
Jesan Fafon

@JesanFafon ไม่ก็ถูกยกเลิกหลังจาก XP ... ฉันคิดว่าคุณ XP ค่าเฉลี่ยและก่อนหน้านี้
pattyd

@pattyd ใน Windows 8.1 ผลตอบแทนwhere msg C:\Windows\System32\msg.exeฉันคิดว่าคุณกำลังคิดnet send
Jesan Fafon

1

แอปพลิเคชันนี้สามารถทำเช่นนั้นได้หากคุณแปลง (ตัด) ไฟล์แบตช์ของคุณเป็นไฟล์ปฏิบัติการ


  1. กล่องข้อความง่าย ๆ

    %extd% /messagebox Title Text
    

  1. Error Messagebox

    %extd% /messagebox  Error "Error message" 16
    
  2. ยกเลิกลองอีกครั้งกล่องข้อความ

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

4) กล่องข้อความ "ไม่ต้องถามฉันอีก"

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

0

ตัวเลือกที่ดีกว่า

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


คำอธิบาย:
lines= จำนวนบรรทัดบวก 1
cols= จำนวนอักขระในข้อความบวก 3 (ต้องมีอย่างน้อย15 )

colsรุ่นที่คำนวณอัตโนมัติ:

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"


@ender_scythe ความคิดเห็นทำงาน ( start cmd /c "@echo off & mode con cols=18 lines=2 & echo My Popup Message & pause>nul") ของคุณไม่ได้ มัน Echos ข้อความ แต่ล้มเหลวในการกำหนดขนาดหน้าต่างกลับมาThe screen cannot be set to the number of lines and columns specified.อย่างน้อยในของ Windows 7
cdlvcdlv

@cdlvcdlv ฉันได้อัปเดตคำตอบแล้ว ตอนนี้มันควรจะใช้ได้สำหรับทุกคนแล้ว
T.Todua

ใช้งานได้จริง ... โดยที่ไม่มีไฟล์xในไดเรกทอรีปัจจุบันหรือคุณไม่คิดว่าจะทำมันหาย
cdlvcdlv

คุณแสดงความคิดเห็นในการทำงานอย่างสมบูรณ์และทำลายมัน จากนั้นคุณพยายามที่จะเพิ่มค่าบางอย่าง (ฉันจะให้คุณที่) แต่แล้วในราคาของการสูญเสียไฟล์ใด ๆ ที่มีชื่อที่ไม่น่าจะเป็นไปได้ หากใครบางคน (จากความอยากรู้) ให้ลองใช้รหัสของคุณกับความโชคร้ายมันจะสูญเสียไฟล์ให้ดี นอกจากนี้หากมีโฟลเดอร์ชื่อxคำสั่งของคุณจะล้มเหลว อย่าขอบคุณฉันและโปรดแก้ไขรหัสของคุณ คุณไม่จำเป็นต้องใช้สายการบินเดียว และถ้าคุณคิดรหัสของคุณเป็นเพื่อที่ดีโปรดโพสต์ไว้ในรหัสตรวจสอบ
cdlvcdlv

สิ่งที่เนรคุณ ... ฉันไม่ได้ยากจน แต่ได้รับการปรับปรุงอธิบายและให้โซลูชั่นอัตโนมัติ ... (แต่มีคนอย่างคุณที่ฉันไม่พอใจ) ขอให้โชคดี
T.Todua

0

นี่คือแบทช์สคริปต์ของฉันที่ฉันรวบรวมไว้โดยยึดตามคำตอบที่ดีที่นี่ & ในโพสต์อื่น ๆ

คุณสามารถตั้งค่าไทม์เอาต์ของชื่อ & แม้กระทั่งสลีปเพื่อกำหนดเวลาสำหรับ & หลังสำหรับบรรทัดใหม่

ตั้งชื่อมันว่า popup.bat และใส่ไว้ในโฟลเดอร์พา ธ ของ windows เพื่อให้ทำงานได้ทั่วโลกบนพีซีของคุณ

ตัวอย่างเช่นpopup Line 1\nLine 2จะสร้างกล่องป๊อปอัพ 2 บรรทัด (ชนิดpopup /?สำหรับการใช้งาน)

นี่คือรหัส

<!-- : 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>

-3

มันจะต้องป๊อปอัพเท่านั้นเมื่ออยู่ใน vm ดังนั้นในทางเทคนิคควรมีรหัสบางอย่างเช่น:

if %machine_type% == virtual_machine then
   echo message box code
else
   continue normal installation code

downvote เนื่องจากการติดตั้งจะไม่ดำเนินการต่อหาก (% machine_type% == virtual_machine) == จริง
anion
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.