如何直接从CMD显示Msgbox


16

我想使用CMD向用户显示一条消息。我知道这样做的方法是创建一个.vbs(VBScript)文件,然后从CMD执行该文件,如下所示:

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

start File.vbs

但是我要做的是直接从CMD显示消息而不创建任何文件。也许通过使用命令直接从CMD运行VBScript。


查找msg命令。如果您正在运行Windows的家庭版,则可能没有它,但是可以通过从Pro安装中复制并粘贴msg.exe来添加它。
wysiwyg

如果可以的话,对于所有Windows 10版本,我都会更“通用”一些。
比塔

也总是有PowerShell。即使Microsoft显然已开始过渡到消除cmd提示,但经常会忽略它。
Appleoddity

Answers:


9

正如其他人所说,没有办法仅使用cmd来执行此操作,但是尽管这是问题的标题,但在我看来,没有文件的部分对您来说更重要,在某些情况下,这是可能的。

使用powershell,应该可以在没有任何文件的情况下运行代码,如下所示:

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

VBS不允许通过cscript或wscript直接执行代码,但mshta允许。您可以像这样使用它(如果需要多行,请使用':'作为分隔符):

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

因为它是基于它的,所以它可能会受到一些gpo限制的影响,因此,如果您选择Powershell,可能是更安全的选择


除了上述有关的警告外mshta,某些防病毒软件还认为它是潜在的有害进程。在工作中,我尝试运行该产品导致了过分热衷的企业产品(SentinelOne)隔离我的整个计算机并将其从网络中删除。
詹森

15

如@wysiwyg所建议,在Windows Pro / Business版本*上,您正在寻找Msg命令。它在所有现代Windows版本中都可用(至少可以追溯到XP)。要向当前登录的用户显示消息,请运行以下命令:

msg %username% Your message here

结果看起来像这样: 在此处输入图片说明

使用此命令的一个注意事项是您不能自定义标题栏文本。

您可以在TechNet上了解有关Msg的更多信息。


*如果您需要一种适用于Windows 所有版本(包括Home)的解决方案,我认为您已经知道的VBScript方法是解决此问题的最简单方法。它在默认配置下可以在Windows的所有现代版本中使用,并且易于使用。


1
并非完全正确。自Windows出现以来,出现了dps消息框命令。我相信它在Windows 7或8中已被删除,因为它被视为可能的利用。
Keltari '18年

2

今天我需要类似的东西。由于找不到真正的VBScript / Powershell爱好者,因此找不到喜欢的外部依赖解决方案,因此我继续写了一个:

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

它产生的消息框是模态当前的控制台窗口。也就是说,在关闭对话框之前,用户无法执行任何操作。此外,来自MessageBox()呼叫的返回代码将返回给调用者,以便脚本可以对按下的任何按钮做出反应。而且,当然,它支持MessageBox()Win32 API 的所有选项。

向混合物中添加80KB可执行文件可能不是每个人的功劳。但是,它与VC ++运行时静态链接,并支持Unicode,这解释了为什么文件如此之大,以至于它具有简约的性质。还有一个小问题,就是无法轻松地从命令行传递换行符以显示多行消息。在较小的方面,它显示的对话框比目前提供的任何其他解决方案都要少。

当然,如果文件大小无关紧要,并且对话框创建的用户体验太“令人讨厌”和/或不需要用户交互,我也会遇到这个漂亮的项目:

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

使用IUserNotification在屏幕的状态通知区域显示弹出气球。缺点是,Notifu可执行文件的运行量仅为240KB。另一个不幸的例子是COM造成不必要的膨胀,让我希望该功能有一个简单,轻便的API。

对于跨平台的东西,有热情。它主要用于Linux,但也有Mac和Windows端口。zenity的Windows端口大小超过1MB,因为GTK相当膨胀。


不是因为它必须在内部运送所有gtk,而本机Windows版本只是选择已经存在的user32 / comctl DLL?
user1686

??请澄清问题。
CubicleSoft

1

我有一种使用cmd来执行此操作的方法,但是它基本上包含一个文件,但是在执行vbs之后会立即删除该文件。因此并非如此。你可以做 :

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

Type + Icon + Action只是基本的vb,仅供参考。https://therevisionist.org/wp-content/uploads/2016/03/vbscript_msgbox_chart-e1458059002411.jpg?x47750 我向您显示的代码制作了一个包含VBS代码的文件,然后使用cscript执行该文件在执行完文件后删除该文件,使其看起来像是由cmd提示发出的。要使其看起来更像,只需使用@echo off即可。希望这对您有所帮助!


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.