【问题标题】:Shell command does not return the correct resultShell 命令没有返回正确的结果
【发布时间】:2019-07-15 17:04:22
【问题描述】:

在我的程序中,我想执行以下命令:

RetVal = Shell("dir > temp", 1)

当我这样做时,我收到以下错误:

运行时错误“53”:找不到文件。

只是做Shell("dir", 1) 会给我同样的错误。但是,如果我使用Shell("help", 1),它会起作用。

dir > temp 命令在命令窗口中运行良好。我尝试使用带有以下命令的 Shell:dircdvertimedatehelp。其中唯一有效的是help

我希望在执行Shell("dir > temp", 1) 时获得一个目录列表,以便我可以使用 temp 执行其他操作。相反,我得到“找不到文件”。

【问题讨论】:

  • 假设(危险地)您的意思是dir > temp,您可能需要为temp 指定完整路径。从命令提示符运行时文件的结束位置可能与 VBA 代码执行时文件的结束位置不同。完全明确是没有坏处的。

标签: vba command-line


【解决方案1】:

并非所有传递给Shell 函数的命令都能像在命令提示符窗口中那样工作。 Shell 函数用于运行可执行文件,而不是执行命令:

运行一个可执行程序并返回一个 Variant (Double) 表示 程序的任务 ID(如果成功);否则返回零。

把它想象成 Windows 中的“运行”实用程序。

您应该首先调用“cmd.exe”,然后将您需要的任何参数/命令传递给它。试试这样的:

Dim myCommand As String
myCommand = "dir"
Shell "cmd.exe /S /K" & myCommand, vbNormalFocus

如果您希望在执行命令后关闭命令提示符窗口,可以将参数/K 替换为/C。在这种情况下,您可能还想使用vbHide 而不是vbNormalFocus

myCommand = "dir > temp"
Shell "cmd.exe /S /C" & myCommand, vbHide

【讨论】:

  • 或者简单地说,Shell "cmd.exe /S /K" & myCommand, vbNormalFocus - 除非你也这样做 Call MsgBox("message")Call BeepCall DoEvents
  • @MathieuGuindon 我没有:-) OP 只是在他们的例子中使用了大括号,所以我不想混淆他/她。再想一想,Call 本身可能更令人困惑,所以你是对的!另外,我刚刚注意到他/她将返回的值分配给一个变量,所以大括号应该可以工作。
  • 不,我只有 this particular thingCall 从未被任何使用过它的人一致地使用 ;-)
  • @MathieuGuindon 这是一个非常有用的答案。谢谢!
猜你喜欢
  • 1970-01-01
  • 2023-03-14
  • 2014-09-13
  • 2012-08-01
  • 2014-05-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多