【问题标题】:Running command.com or cmd.exe from VBA causing problems with MSG command从 VBA 运行 command.com 或 cmd.exe 导致 MSG 命令出现问题
【发布时间】:2016-12-17 00:30:50
【问题描述】:

当我从 VBA 中打开命令提示符时,我无法让 msg 工作,但是已经证明它在从 Windows 启动 cmd.exe 或“命令提示符”时工作。

我的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 的启动方式而有所不同?

【问题讨论】:

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

标签: windows vba cmd


【解决方案1】:

问题在于 64 位 Windows 将调用定向到 32 位应用程序的方式。 Windows 有一个名为 SysNative 的虚拟文件夹,当从 32 位应用程序访问 64 位可执行文件时,需要使用该文件夹来代替 System32。这是一个很好的解释:http://www.samlogic.net/articles/sysnative-folder-64-bit-windows.htm

代码需要是:

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

这里是相关的 MSDN 页面:https://msdn.microsoft.com/en-us/library/aa384187%28v=vs.85%29.aspx

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-12
    • 2011-06-29
    相关资源
    最近更新 更多