Windows 从VBA运行command.com或cmd.exe导致MSG命令出现问题

Windows 从VBA运行command.com或cmd.exe导致MSG命令出现问题,windows,vba,cmd,Windows,Vba,Cmd,当我从VBA中打开命令提示符时,我无法使msg正常工作,但事实证明,从windows启动cmd.exe或“命令提示符”时,msg正常工作 我的VBA代码如下所示: Sub test() Dim str_to_pass As String str_to_pass = "msg" Call Shell("cmd.exe /s /k " & str_to_pass, vbNormalFocus) End Sub 我从内部命令提示符得到的结果:“'msg'未被识别为内部或外部命令,…”

当我从VBA中打开命令提示符时,我无法使msg正常工作,但事实证明,从windows启动cmd.exe或“命令提示符”时,msg正常工作

我的VBA代码如下所示:

Sub test()
Dim str_to_pass As String

str_to_pass = "msg"

Call Shell("cmd.exe /s /k " & str_to_pass, vbNormalFocus)

End Sub
我从内部命令提示符得到的结果:“'msg'未被识别为内部或外部命令,…”

但是,如果我先从windows打开命令提示符或cmd.exe,然后键入“msg”,我会得到如何使用msg的语法提示


那么,如何从vba访问命令提示符的可用性,以及为什么命令会根据cmd.exe的启动方式而有所不同?

问题在于64位Windows将调用定向到32位应用程序和从32位应用程序调用的方式。Windows有一个名为
SysNative
文件夹的虚拟文件夹,当从32位应用程序访问64位可执行文件时,需要使用该文件夹代替
System32
。这里有一个很好的解释:

代码需要是:

str_to_pass = "c:\windows\sysnative\msg"
Call Shell("cmd.exe /s /k " & str_to_pass, vbNormalFocus)

下面是相关的MSDN页面:

更让人困惑的是,我创建了一段代码来创建shell命令的批处理文件,然后运行该bat文件,而不是尝试调用shell。它生成批处理文件,如果我从VBA外部打开批处理文件,则批处理文件可以工作。但是,当我从VBA以编程方式打开批处理时,我会得到与以前相同的结果。在命令提示下输入
where msg
,并将
str\u改为\u pass
改为它打印的完整路径名。这可能在Windows\System32中。这就是我的位置,输入.exe的完整路径仍然会产生相同的错误消息。(我很生气老板让我做实际工作,因为这是我今天想做的事情!)这是一个非常好的问题。哦,顺便说一句,我注意到Shell打开的cmd窗口的环境变量与我手动打开的cmd窗口的环境变量不同。我尝试了where msg建议,得到了相同的结果。在vba通过shell启动的cmd提示符中,我无法访问msg,即使路径名为c:\windows\system32\msg.exe