Windows 배치 파일에서 팝업 / 메시지 상자 표시


Answers

아주 간단한 VBScript 파일을 만들고 CScript를 사용하여 명령 줄 매개 변수를 구문 분석합니다.

MessageBox.vbs 다음과 같은 내용이 저장되어 있습니다.

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

당신은 다음과 같이 부를 것입니다 :

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

이 경로를 사용하려면 MsgBox 참조를 참조 하십시오.

Question

배치 파일에서 메시지 상자를 표시하는 방법이 있습니까 ( xmessage 를 Linux의 bash 스크립트에서 사용할 수있는 것과 비슷합니다)?




VM 내부에서만 팝업이 필요하므로 기술적으로 다음과 같은 코드가 있어야합니다.

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



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

- 0 대신에 0,1,2,3,4에서 임의의 숫자를 쓸 수 있습니다 ( '+'기호 앞에). & 여기에 각 숫자의 의미가 있습니다.

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

- 16 대신에 16,32,48,64의 숫자를 쓸 수 있습니다 ( '+'기호 다음) & 각 숫자의 의미는 다음과 같습니다.

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



Zenity 를 사용할 수 있습니다. Zenity에서는 명령 줄 및 셸 스크립트에서 대화 상자를 실행할 수 있습니다. 더 많은 정보는 Wikipedia 에서도 찾을 수 있습니다.

그것은 교차 플랫폼입니다. Windows 용 Windows 설치 프로그램은 here 에서 찾을 수 here .




msg * /time:0 /w Hello everybody!

이 메시지는 OK를 클릭 할 때까지 기다립니다 (기본적으로 1 분만 지속됨). Windows 8.1에서 정상적으로 작동합니다.




당신은 내가 생각하는 user32.dll에서 dll 함수를 호출 할 수있다.

Rundll32.exe user32.dll, MessageBox (0, "text", "titleText", {최상위 메시지 상자 등의 추가 플래그})

내 전화에서 그것을 입력, 나를 판단하지 ... 그렇지 않으면 여분의 플래그를 연결합니다.




여기에 창을 만들기 전에 어셈블리를로드 할 필요가없는 PowerShell 변형이 있지만 @npocmaka가 게시 한 PowerShell MessageBox 명령보다 현저하게 느리게 실행됩니다 (~ 50 %).

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

마지막 "0x0"매개 변수를 변경하여 예를 들어 대화 상자에 다른 아이콘을 표시 할 수 있습니다. 0x40은 "정보 표시"를 나타냅니다. 참조를 위해 Popup Method 를 참조하십시오.

Microsoft TechNet 기사 PowerTip : PowerShell을 사용하여 팝업 창 표시




무엇보다도 DOS는 아무 관련이 없습니다. Windows 명령 줄 솔루션 (다시 말하면 DOS, 순수 Windows, Window가 아니라 콘솔)을 원할 것입니다.

boflynn에서 제공하는 VBScript 메소드를 사용하거나 net send 또는 msg 잘못 사용할 수 있습니다. net send 는 이전 버전의 Windows에서만 작동합니다.

net send localhost Some message to display

또한 메신저 서비스를 실행하는 데에도 달려 있습니다.

최신 버전 (XP 이상 버전) :

msg "%username%" Some message to display

msg.exe 를 사용하여 보낸 메시지 상자는 60 초 동안 만 지속됩니다. 그러나 이것은 /time:xx 스위치로 무시할 수 있습니다.




이렇게하면 배치 파일이 VBS 스크립트를 만들고 팝업을 표시합니다. 실행 후 배치 파일은 해당 중간 파일을 삭제합니다.

MSGBOX를 사용하는 장점은 MSG.exe가 그리 많지는 않지만 실제로 사용자 정의 할 수 있다는 것입니다 (제목, 아이콘 등 변경).

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



시도해보십시오.

Msg * "insert your message here" 

Windows XP의 command.com을 사용하는 경우 메시지 상자가 열립니다.

새로운 cmd 창을 여는 것은 당신이 요구했던 것이 아닙니다. VBScript 를 사용하여 .bat 파일과 함께 사용할 수도 있습니다. 다음 명령을 사용하여 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 파일로 저장하고 파일 이름 아래의 드롭 다운 상자에 "모든 파일"로 저장합니다 (따라서 .txt로 저장하지 않습니다). )를 선택한 다음 저장을 클릭하십시오.




그러면 다른 명령 프롬프트 창이 팝업됩니다 :

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






application 은 배치 파일을 실행 파일로 변환 (랩핑)하면 그렇게 할 수 있습니다.

  1. 단순한 Messagebox

    %extd% /messagebox Title Text
    
  1. 오류 메시지 상자

    %extd% /messagebox  Error "Error message" 16
    
  2. 취소 다시 시도 Messagebox

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

4) "다시 묻지 마라."Messagebox

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



몇 가지 방법.

1) geekest와 hackiest - 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 사용. 또한 XP와 그 이상의 모든 Windows 컴퓨터에서 작동합니다 (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 hybrid 매개 변수가 있습니다 ( bat 로 저장해야 함). OP 요청에도 불구하고 JavaScript를 다시 사용하지만 박쥐이므로 걱정없이 박쥐 파일로 호출 할 수 있습니다. 그것은 대중적인 MSGBOX 보다 조금 더 제어 할 수있는 POPUP 을 사용합니다. 위의 예와 같이 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) 그리고 here dbenham의 접근법

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



이를 위해 메시지 상자를 표시하고 배치 파일에서 메시지 상자를 실행하는 작은 프로그램이 필요합니다.

프롬프트를 표시하는 콘솔 창을 열 수 있지만 cmd.exe와 친구 만 사용하는 GUI 메시지 상자는 사용할 수 없습니다. AFAIK.




@ Fowl의 답변에 이어 다음을 사용하여 10 초 동안 만 표시되도록 제한 시간을 설정하여 개선 할 수 있습니다.

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

자세한 내용은 here 를 참조하십시오.




메시지 * "여기에 메시지를 삽입하십시오."

잘 작동합니다. 그냥 메모장에. 박쥐 파일로 저장하거나 형식이 "모든 파일"로 설정되어 있는지 확인하십시오.




더 나은 옵션
start cmd /c "@echo off & mode con cols=12 lines=2 & echo My Message & pause>nul"

사용법 :
cols= 메시지의 문자 양에 2를 cols=
lines= 양에 1을 더함

(감사합니다 @ender_scythe )




약간의 플래시를 표시 할 수 있지만 임시 파일은 필요하지 않습니다. (IIRC) IE5 시대의 어딘가로 돌아 가야합니다.

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

다음과 같은 경우에 괄호이스케이프 처리하는 것을 잊지 마십시오.

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



msg * /server:127.0.0.1 여기에 메시지를 입력하십시오.