Come visualizzare un Msgbox direttamente da CMD


16

Vorrei mostrare un messaggio all'utente usando CMD. Il modo in cui so di farlo è creando un file .vbs (VBScript) ed eseguirlo da CMD in questo modo:

(echo MsgBox "Line 1" ^& vbCrLf ^& "Line 2",262192, "Title")> File.vbs

start File.vbs

Ma quello che voglio fare è visualizzare il messaggio senza creare alcun file, direttamente da CMD. Forse usando un comando per eseguire VBScripts direttamente da CMD.


Cerca il msgcomando. Potresti non averlo se stai eseguendo un'edizione Home di Windows, ma puoi aggiungerlo semplicemente copiando e incollando msg.exe da un'installazione Pro.
wysiwyg,

Vorrei qualcosa di un po 'più "universale", per tutte le versioni di Windows 10 se c'è un modo.
Bita,

C'è sempre anche PowerShell. Spesso trascurato, anche se Microsoft ha chiaramente iniziato la transizione verso l'eliminazione del prompt cmd.
Appleoddity,

Risposte:


9

Come altri hanno già detto, non c'è modo di farlo puramente con cmd ma sebbene sia questo il titolo della domanda, mi sembra che la parte senza file sia più importante per te e in determinate circostanze ciò potrebbe essere possibile.

Con PowerShell dovrebbe essere possibile eseguire il codice senza file di questo tipo:

PowerShell -Command "Add-Type -AssemblyName PresentationFramework;[System.Windows.MessageBox]::Show('Hello World')"

VBS non consente l'esecuzione diretta del codice tramite cscript o wscript ma mshta lo fa. Puoi usarlo in questo modo (se hai bisogno di più righe usa ':' come delimitatore):

mshta vbscript:Execute("msgbox ""Hello World"":close")

Dato che è basato su ciò, potrebbe essere influenzato da alcune restrizioni GPO, quindi se hai la scelta PowerShell è probabilmente la scommessa più sicura


Oltre all'avviso di cui sopra mshta, alcuni software antivirus lo considerano un processo potenzialmente indesiderato. Al lavoro, il mio tentativo di eseguirlo ha prodotto un prodotto aziendale troppo zelante (SentinelOne) per mettere in quarantena l'intero computer e rimuoverlo dalla rete.
Jason il

15

Come suggerito da @wysiwyg, nelle versioni Pro / Business * di Windows stai cercando il Msgcomando. È disponibile in tutte le versioni moderne di Windows (almeno fino a XP). Per visualizzare un messaggio per l'utente attualmente connesso, eseguire quanto segue:

msg %username% Your message here

Il risultato è simile al seguente: inserisci qui la descrizione dell'immagine

Una considerazione con questo comando è che non puoi personalizzare il testo della barra del titolo.

Puoi saperne di più su Msg su TechNet .


* Se hai bisogno di una soluzione che funzioni su tutte le edizioni di Windows, inclusa Home , secondo me il metodo VBScript di cui sei già a conoscenza è la soluzione più semplice a questo problema. Funziona su tutte le versioni e edizioni moderne di Windows nella loro configurazione predefinita ed è facile da usare.


1
Non del tutto vero. C'è stato un comando dps message box da quando Windows è uscito. Credo che sia stato rimosso in Windows 7 o 8 in quanto è stato visto come un possibile exploit.
Keltari,

2

Avevo bisogno di qualcosa di simile oggi. Dal momento che non riuscivo a trovare una soluzione di dipendenza esterna che mi piaceva poiché non sono un vero fan di VBScript / Powershell, sono andato avanti e ne ho scritto uno:

https://github.com/cubiclesoft/messagebox-windows

Le finestre di messaggio che produce sono modali alla finestra della console corrente. Cioè, l'utente non può fare nulla fino a quando non chiude la finestra di dialogo. Inoltre, il codice di ritorno dalla MessageBox()chiamata viene restituito al chiamante in modo che uno script possa reagire a qualunque pulsante sia stato premuto. E, ovviamente, supporta l'intera gamma di opzioni per l' MessageBox()API Win32.

L'aggiunta di un eseguibile da 80 KB al mix potrebbe non essere la tazza di tè di tutti. Tuttavia, è staticamente collegato al runtime VC ++ e supporta Unicode, il che spiega perché il file è così grande data la natura minimalista di ciò che fa. E c'è un piccolo problema di non riuscire a passare facilmente le nuove righe dalla riga di comando per visualizzare messaggi multilinea. Su un lato positivo minore, visualizza la finestra di dialogo in meno tempo di clock rispetto a qualsiasi altra soluzione presentata finora.

Naturalmente, se le dimensioni del file non contano e le finestre di dialogo creano un'esperienza utente troppo "in faccia" e / o non richiedono l'interazione dell'utente, mi sono imbattuto in questo elegante progetto:

https://www.paralint.com/projects/notifu/

Che visualizza un fumetto popup nell'area di notifica dello stato dello schermo utilizzando IUserNotification . Il rovescio della medaglia è che l'eseguibile di Notifu funziona a meno di 240 KB. Un altro sfortunato esempio che COM crea un gonfiamento inutile e mi fa desiderare che ci sia un'API semplice e leggera per la funzionalità.

Per qualcosa di multipiattaforma, c'è zenità. È principalmente per Linux ma ci sono anche porte per Mac e Windows. La porta di zenity di Windows ha dimensioni superiori a 1 MB perché, beh, GTK è piuttosto gonfio.


Non perché deve spedire tutta GTK internamente mentre le versioni native di Windows raccolgono le DLL user32 / comctl che sono già lì?
user1686

Eh? Si prega di chiarire la domanda.
CubicleSoft

1

Ho un modo per farlo con cmd, ma fondamentalmente include un file, ma il file viene eliminato immediatamente dopo l'esecuzione del vbs. Quindi non lo è davvero. Tu puoi fare :

echo x=msgbox("Hey! Here is a message!",Type+Icon+Action,"Hey! Here is a title!") > %tmp%\tmp.vbs
cscript //nologo %tmp%\tmp.vbs
del %tmp%\tmp.vbs

Tipo + Icona + Azione è solo vbs di base, per un riferimento, qui. https://therevisionist.org/wp-content/uploads/2016/03/vbscript_msgbox_chart-e1458059002411.jpg?x47750 Il codice che ti ho mostrato crea un file che contiene codice VBS, quindi lo esegue usando cscript, quindi lo esegue elimina il file dopo che è stato eseguito facendolo sembrare come se fosse stato convocato dal prompt cmd. Per renderlo più simile, basta usare @echo off. Spero che questo abbia aiutato!


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.