Pergunta

Existe uma maneira para exibir uma caixa de mensagem a partir de um arquivo de lote (semelhante à forma como xmessage pode ser usado a partir festança-scripts em Linux)?

Foi útil?

Solução

Gostaria de fazer um arquivo VBScript muito simples e chamá-lo usando CScript para analisar os parâmetros de linha de comando.

Algo como o seguinte salvos em MessageBox.vbs:

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

O que você chamaria como:

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

MsgBox referência se estiver interessado em ir esta rota.

Outras dicas

Em primeiro lugar, DOS não tem nada a ver com isso, você provavelmente vai querer uma solução de linha de comando do Windows. (Mais uma vez: no DOS, o Windows pura, não apenas uma janela, mas um Console)

Você pode usar o método VBScript fornecido pelo boflynn ou você pode mis-use net send ou msg. net send só funciona em versões mais antigas do Windows:

net send localhost Some message to display

Isso também depende o serviço Messenger para ser executado, apesar de tudo.

Para versões mais recentes (XP em diante, aparentemente):

msg "%username%" Some message to display

Deve-se notar que uma caixa de mensagem enviada usando msg.exe só vai durar por 60 segundos. Isto pode, contudo, ser substituído com a chave /time:xx.

Pode exibir um pouco de flash, mas não arquivos temporários necessários. Deve trabalhar todo o caminho de volta para algum lugar na era (IIRC) IE5.

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

Não se esqueça de escapar de seus parênteses se você' re usando if:

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

Isto irá abrir outra janela do prompt de comando:

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

Tente:

Msg * "insert your message here" 

Se você estiver usando command.com do Windows XP, isso vai abrir uma caixa de mensagem.

Abrir uma nova janela cmd não é o que você estava pedindo é, suponho. Você também pode usar VBScript , e usar isso com o seu arquivo .bat. Você poderia abri-lo a partir do arquivo bat com este comando:

cd C:\"location of vbscript"

O que isto faz é mudar o command.com diretório irá procurar por arquivos de, em seguida, na linha seguinte:

"insert name of your vbscript here".vbs

Em seguida, você cria um novo Notepad documento, digite

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

Você, então, salve como um arquivo .vbs (por colocar ".vbs" no final do nome do arquivo), Salvar como 'Todos os arquivos' na caixa suspensa abaixo do nome do arquivo (por isso não salva como .txt) e clique em Salvar!

Desta forma, o arquivo de lote irá criar um script VBS e mostrar um popup. Depois ele é executado, o arquivo batch irá apagar o arquivo intermediário.

A vantagem de usar MSGBOX é que ele é realmente customaziable (mudar o título, o ícone etc), enquanto Msg.exe não é tanto.

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

Poucos mais maneiras.

1) O geekiest e hackiest - ele usa o IEXPRESS para criar pequenas exe que irá criar um pop-up com um único botão ( ele pode criar mais dois tipos de mensagens pop-up ). Funciona em Windows CADA de XP e acima:

;@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) Usando MSHTA. Também funciona em todas as máquinas Windows a partir do XP e acima (apesar do OP não quer línguas "externas" do JavaScript aqui é minimizado). Deve ser salvo como .bat:

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

alert("Hello, world!");

ou em uma linha:

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

ou

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

ou

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

3) Aqui está híbrida .bat/jscript parametrizado (deve ser salvo como bat). -Lo novamente usa JavaScript, apesar do pedido OP, mas como é um morcego que pode ser chamado como um arquivo bat sem preocupações. Ele usa POPUP que permite um pouco pouco mais de controle do que os mais populares MSGBOX . Ele usa WSH, mas não MSHTA como no exemplo acima.

 @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) e um híbrido jscript.net/.bat (deve ser salvo como .bat) .Este tempo que usa .NET e compila um pequeno arquivo .exe que poderiam ser excluídos:

@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) e no final uma única chamada para PowerShell que cria um pop-up (pode ser chamado de linha de comando ou lote se PowerShell está instalado):

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

6) E a abordagem do dbenham visto aqui

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

7 ) para um notificações da bandeja do sistema que você pode tentar este :

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

Aqui está uma variante PowerShell que não requer assembleias de carregamento antes de criar a janela, no entanto ele é executado visivelmente mais lento (~ 50%) do que o comando PowerShell MessageBox postado aqui por @npocmaka:

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

Você pode alterar o último parâmetro de "0x0" para um valor abaixo para ícones de exibição na caixa de diálogo (ver Método Popup para referência futura):

Stop 0x10 Parar
ponto de interrogação 0x20 Question Mark
Ponto de exclamação 0x30 Exclamation Mark
Informações Mark 0x40 Informação Mark

Adaptado do artigo da Microsoft TechNet Super Dica:. Use PowerShell para exibir janela pop-up

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

-você pode escrever qualquer número de 0,1,2,3,4 em vez de 0 (antes do símbolo ‘+’) e aqui é o significado de cada número:

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

-você pode escrever qualquer número de 16,32,48,64 vez de 16 (após o símbolo ‘+’) e aqui é o significado de cada número:

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

Msg * "Inserir aqui a sua mensagem"

funciona bem, basta salvar como um arquivo .bat no bloco de notas ou verifique se o formato é definido como "todos os arquivos"

A fim de fazer isso, você precisa ter um pequeno programa que exibe uma messagebox e prazo que a partir de seu arquivo em lotes.

Você pode abrir uma janela do console que exibe uma embora rápido, mas recebendo uma caixa de mensagem GUI usando cmd.exe e amigos não só é possível, AFAIK.

Eu uso um utilitário chamado msgbox.exe a partir daqui: http://www.paulsadowski.com/WSH/cmdprogs.htm

Você pode usar Zenity . Zenity permite a execução de caixas de diálogo em scripts de linha de comando e de fachada. Mais informações também podem ser encontradas no Wikipedia .

É multi-plataforma: um instalador do Windows para o Windows pode ser encontrada aqui <. / p>

msg * /time:0 /w Hello everybody!

Esta mensagem espera para sempre, até que OK é clicado (que dura apenas um minuto por padrão) e funciona bem no Windows 8.1

Na sequência @ resposta de Fowl, você pode melhorá-lo com um tempo limite para só aparecem por 10 segundos usando o seguinte:

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

Consulte aqui para mais detalhes.

Você pode chamar dll função de user32.dll eu acho Algo como

Rundll32.exe user32.dll, MessageBox (0, "texto", "TitleText", {flags adicionais para como superior messagebox e.t.c})

Digitando-lo do meu telefone, não me julgue ... caso contrário eu ligaria as bandeiras extras.

msg * /server:127.0.0.1 Digite aqui sua mensagem

Este aplicação pode fazer isso, se você converter (envoltório) seus arquivos em lote em arquivos executáveis.


  1. simples Messagebox

    %extd% /messagebox Title Text
    

  1. Erro Messagebox

    %extd% /messagebox  Error "Error message" 16
    
  2. Cancelar Tentar novamente Messagebox

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

4) "Nunca me pergunte novamente" Messagebox

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

A melhor opção

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


Descrição: quantidade lines=
de linhas, mais 1
quantidade cols= de caracteres na mensagem, mais 3 (No entanto, mínima deve ser 15)

Auto-calculada versão 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"

Precisa apenas pop-up quando dentro de uma VM, então tecnicamente, deve haver algum código como:

if %machine_type% == virtual_machine then
   echo message box code
else
   continue normal installation code
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top