Existe uma maneira de exibir uma caixa de mensagem de um arquivo em lotes (semelhante a como xmessagepode ser usado a partir de scripts bash no Linux)?
Existe uma maneira de exibir uma caixa de mensagem de um arquivo em lotes (semelhante a como xmessagepode ser usado a partir de scripts bash no Linux)?
Respostas:
Eu criaria um arquivo VBScript muito simples e o chamaria usando CScript para analisar os parâmetros da linha de comando.
Algo como o seguinte foi salvo em MessageBox.vbs:
Set objArgs = WScript.Arguments
messageText = objArgs(0)
MsgBox messageText
Você chamaria assim:
cscript MessageBox.vbs "This will be shown in a popup."
MsgBoxreferência se você estiver interessado em seguir esta rota.
Antes de tudo, o DOS não tem nada a ver com isso; você provavelmente deseja uma solução de linha de comando do Windows (novamente: sem DOS, Windows puro, apenas não uma janela, mas um console).
Você pode usar o método VBScript fornecido por boflynn ou pode usar mal net sendou msg. net sendfunciona apenas em versões mais antigas do Windows:
net send localhost Some message to display
Porém, isso também depende do serviço do Messenger para ser executado.
Para versões mais recentes (XP e posteriores, aparentemente):
msg "%username%" Some message to display
Note-se que uma caixa de mensagem enviada usando msg.exedura apenas 60 segundos. No entanto, isso pode ser substituído pelo /time:xxcomutador.
Pode exibir um pouco de flash, mas nenhum arquivo temporário é necessário. Deve funcionar de volta a algum lugar da era (IIRC) IE5.
mshta javascript:alert("Message\n\nMultiple\nLines\ntoo!");close();
Não se esqueça de escapar dos parênteses se estiver usando if:
if 1 == 1 (
mshta javascript:alert^("1 is equal to 1, amazing."^);close^(^);
)
close() was unexpected at this time.
^caracteres de escape em um arquivo bat
Isso abrirá outra janela do prompt de comando:
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"altere cols=18para a quantidade de caracteres na mensagem + 2. E o lines=2para qualquer que seja a quantidade de linhas é + 1.
cmd /k
Experimentar :
Msg * "insert your message here"
Se você estiver usando o command.com do Windows XP, isso abrirá uma caixa de mensagem.
Abrir uma nova janela do cmd não é exatamente o que você estava pedindo, pelo que entendi. Você também pode usar o VBScript e usá-lo com o seu arquivo .bat. Você o abriria do arquivo bat com este comando:
cd C:\"location of vbscript"
O que isso faz é alterar o diretório command.com procurará por arquivos e, na próxima linha:
"insert name of your vbscript here".vbs
Em seguida, você cria um novo documento do bloco de notas , digite
<script type="text/vbscript">
MsgBox "your text here"
</script>
Você então salvaria isso como um arquivo .vbs (colocando ".vbs" no final do nome do arquivo) e salve como "Todos os arquivos" na caixa suspensa abaixo do nome do arquivo (para que não seja salvo como .txt ) e clique em Salvar!
<script/>tag.
msg *, será solicitado a inserir uma mensagem seguida de ctrl-Z. Você pode inserir quebras de linha aqui que aparecerão na sua mensagem.
Mais algumas maneiras.
1) O mais geek e hackiest - ele usa o IEXPRESS para criar um exe pequeno que criará um pop-up com um único botão ( ele pode criar mais dois tipos de mensagens pop-up ). Funciona em TODAS as janelas do 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 desejar idiomas "externos", o 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á o .bat/jscripthíbrido parametrizado (deve ser salvo como bat). Ele novamente usa JavaScript, apesar da solicitação do OP, mas como é um bastão, pode ser chamado como um arquivo bat sem preocupações. Ele usa POPUP, que permite um pouco mais de controle do que o MSGBOX mais popular . Ele usa o WSH, mas não 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 jscript.net/.bathíbrido (deve ser salvo como .bat). Desta vez, ele usa .NETe compila um pequeno .exearquivo que pode ser excluído:
@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 o PowerShell que cria um pop-up (pode ser chamado na linha de comando ou em lote, se o PowerShell estiver instalado):
powershell [Reflection.Assembly]::LoadWithPartialName("""System.Windows.Forms""");[Windows.Forms.MessageBox]::show("""Hello World""", """My PopUp Message Box""")
6) E a abordagem do dbenham vista aqui
start "" cmd /c "echo(&echo(&echo Hello world! &echo(&pause>nul"
7 ) Para as notificações da bandeja do sistema, você pode tentar o seguinte :
call SystemTrayNotification.bat -tooltip warning -time 3000 -title "Woow" -text "Boom" -icon question
Dessa forma, seu arquivo em lotes criará um script VBS e exibirá um pop-up. Após a execução, o arquivo em lotes excluirá esse arquivo intermediário.
A vantagem de usar o MSGBOX é que ele é realmente habitável (altere o título, o ícone etc.), enquanto o MSG.exe não é o mesmo.
echo MSGBOX "YOUR MESSAGE" > %temp%\TEMPmessage.vbs
call %temp%\TEMPmessage.vbs
del %temp%\TEMPmessage.vbs /f /q
Aqui está uma variante do PowerShell que não exige o carregamento de assemblies antes da criação da janela; no entanto, é notavelmente mais lenta (~ + 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 exibir ícones na caixa de diálogo (consulte Método pop-up para obter mais referências):
0x10 Parar
0x20 Ponto de interrogação
0x30 Ponto de exclamação
0x40 Ponto de informações
Adaptado do artigo Microsoft TechNet PowerTip: Use o PowerShell para exibir a janela pop-up .
echo X=MsgBox("Message Description",0+16,"Title") >msg.vbs
–Pode escrever qualquer número de 0,1,2,3,4 em vez de 0 (antes do símbolo '+') e aqui está 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
–Pode escrever qualquer número entre 16,32,48,64 em vez de 16 (após o símbolo '+') e aqui está o significado de cada número:
16 – Critical Icon
32 – Warning Icon
48 – Warning Message Icon
64 – Information Icon
Msg * "insira sua mensagem aqui"
funciona bem, apenas salve como um arquivo .bat no bloco de notas ou verifique se o formato está definido como "todos os arquivos"
msg %SESSIONNAME% msg
msg * /time:0 /w Hello everybody!
Essa mensagem aguarda uma eternidade até clicar em OK (dura apenas um minuto por padrão) e funciona bem no Windows 8.1
msg * /time:0 /w <C:\Somewhere\Message.txtonde no arquivo há texto normal (contendo CrLf).
Para fazer isso, você precisa de um pequeno programa que exiba uma caixa de mensagens e execute-o no seu arquivo em lotes.
Você pode abrir uma janela do console que exibe um prompt, mas não é possível obter uma caixa de mensagem da GUI usando apenas cmd.exe e amigos, AFAIK.
Eu uso um utilitário chamado msgbox.exe a partir daqui: http://www.paulsadowski.com/WSH/cmdprogs.htm
Seguindo a resposta de @ Fowl, você pode melhorá-lo com um tempo limite para aparecer apenas por 10 segundos usando o seguinte:
mshta "javascript:var sh=new ActiveXObject( 'WScript.Shell' ); sh.Popup( 'Message!', 10, 'Title!', 64 );close()"
Veja aqui para mais detalhes.
Você pode invocar a função DLL do user32.dll eu acho que algo como
Rundll32.exe user32.dll, MessageBox (0, "texto", "titleText", {sinalizadores extras para as principais caixas de mensagens, etc})
Digitando no meu telefone, não me julgue ... caso contrário, eu vincularia as bandeiras extras.
rundll32.exe user32.dll,MessageBoxA Xexibir uma caixa de mensagens com X como título quando o faço na caixa Executar. Não importa o que eu faça X ser, não consigo interpretá-lo como vários parâmetros - tudo vai para o título. Portanto, rundll32.exe user32.dll,MessageBoxA (0, "MyTitle", "MyText", 0)exibe uma caixa de mensagens com o título (0, "MyTitle", "MyText", 0) Mas eu não consigo fazê-la funcionar A TUDO na linha de comando - apenas na caixa Executar. Na linha de comando, ele não faz nada. Funciona com certeza a partir de uma linha de comando ou de um arquivo em lotes ou apenas da caixa Executar?
msg * /server:127.0.0.1 Digite sua mensagem aqui
where msgretorna C:\Windows\System32\msg.exe. Eu acho que você está pensando emnet send
Esse aplicativo pode fazer isso se você converter (agrupar) seus arquivos em lotes em arquivos executáveis.
Simple Messagebox
%extd% /messagebox Title Text
Mensagem de erro
%extd% /messagebox Error "Error message" 16
Cancelar Tente 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}
Uma opção melhor
set my_message=Hello world&& start cmd /c "@echo off & mode con cols=15 lines=2 & echo %my_message% & pause>nul"
Descrição:
lines= quantidade de linhas, mais 1
cols= quantidade de caracteres na mensagem e mais 3 (no entanto, o mínimo deve ser 15)
colsVersão calculada automaticamente: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"). O seu não. Ele ecoa a mensagem, mas não consegue definir o tamanho da janela de retornar The screen cannot be set to the number of lines and columns specified.pelo menos em meu Windows 7.
xno diretório atual ou você não se importe de perdê-lo.
x, seu comando falhará. Não me agradeça e apenas corrija seu código. Você nem precisa usar uma linha. E se você acha que seu código é tão bom, publique-o na Revisão de Código .
Aqui está o meu script em lote que eu montei com base nas boas respostas aqui e em outros posts
Você pode definir o tempo limite do título e até dormir para agendá-lo para o último & \ n para a nova linha
Nomeie-o como popup.bat e coloque-o na pasta do caminho do Windows para funcionar globalmente no seu PC
Por exemplo popup Line 1\nLine 2, produzirá uma caixa pop-up de 2 linhas (digite popup /?para uso)
Aqui está o código
<!-- : 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>
ele só precisa aparecer quando estiver dentro de uma vm; portanto, tecnicamente, deve haver algum código como:
if %machine_type% == virtual_machine then
echo message box code
else
continue normal installation code