【问题标题】:Environment Variables not recognized when calling Run in WScript.Shell object在 WScript.Shell 对象中调用 Run 时无法识别环境变量
【发布时间】:2018-07-24 23:11:53
【问题描述】:

如果我在命令行中运行命令Rscript "C:/TEMP/test.R",它会起作用,并且我的脚本会按预期运行。一旦我尝试在我的 VBA 代码中运行它,它就不会将 Rscript 识别为有效命令。

Dim shell_obj As Object
Set shell_obj = VBA.CreateObject("WScript.Shell")
Dim errorCode As Integer
errorCode = shell_obj.Run("Rscript ""C:/TEMP/test.R""", 1, True)

当我查看 WScript.Shell 使用的 PATH 变量时,我发现它不包含内部带有 Rscript 路径的系统变量。

Dim shell_obj As Object
Dim wshSystemEnv As Object
Set shell_obj = VBA.CreateObject("WScript.Shell")

' This one does not include the path to the Rscript'
Debug.Print shell_obj.ExpandEnvironmentStrings("%PATH%")
Set wshSystemEnv = shell_obj.Environment("SYSTEM")
' This one includes the path to the Rscript'
Debug.Print wshSystemEnv("PATH")

我可以强制 WScript.Shell 对象使用系统环境吗?或者至少使用它的变量?

命令:

VBA(版本 1):

VBA(第 2 版):

【问题讨论】:

  • 在 VBA 中,只需使用 Environ("path")。不需要 WScript 或 RScript。
  • 所以你的问题是系统没有自动检查rscript.exe所在的路径,对吗?你知道那个fie的正确位置是什么吗? (您确定了,我们可以将其添加到现有路径中。)
  • 我在我的电脑里知道。但是代码可能会在其他人的机器上使用不同版本的 R(这会改变路径)。因此,放置修复路径并不能解决问题。
  • 您没有提到涉及其他计算机。我现在很困惑:您的问题说您可以从命令提示符运行它,但不能从 VBA 运行它。第一步是让它在你的上面运行,即使路径现在是硬编码的。 您的计算机上的rscript.exe 位于何处?一旦你在你的机器上运行了这个,我们就可以担心其他人......
  • 根据我所做的研究,该文件的路径差异很大,因为R 包没有“标准”安装位置。我可以帮助编写代码以编程方式定位文件,但在脚本在 your 具有 known 路径的机器上正常运行之前,我不会打扰。

标签: vba shell


【解决方案1】:

编辑见帖子底部。

希望你能在我的(冗长的)这方面找到一些用处...:-)


测试命令行准备情况

任何可以按原样从 Windows 命令行运行的命令 (including an RScript) 都可以使用the VBA Shell function 或@987654323 运行@。

问题是,您的cmd 字符串没有 准备好命令行。这可以通过点击 +R 并粘贴 cmd 字符串变量的内容来确认:

Rscript "**path**/test.R"

我目前没有安装rscript.exe,但我怀疑如果您尝试在运行 窗口或命令行中手动运行命令,您会收到错误消息。如果它不在那里运行,它显然不会在 VBA Shell 中运行。

据我了解,双星号是您使用它的方式Java notationR 中是same as a ^ caret character,用于计算指数。


引用环境变量

要在VBA 中返回Windows PATH environment variable,您可以使用VBA's Environ function

要插入值环境变量inline at the command line,您可以用%percent% 符号将其包围,例如%path%


Windows 的PATH 环境变量

PATH 不返回单个文件夹。这是一个文件夹列表,Windows 应该检查它以找到一个尝试运行的可执行文件。

当在命令shell中输入命令或程序进行系统调用以执行程序时,系统首先搜索当前工作目录,然后搜索路径,从左到右检查每个目录,寻找与给定命令名匹配的可执行文件名。

Windows 系统目录(通常为C:\WINDOWS\system32)通常是路径中的第一个目录,其后是许多(但不是全部)已安装软件包的目录。

PATH (from a fresh install of Windows 7) 的默认值示例是:

%SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem

%path%, this includes%SystemRoot%` 一样,在 Windows 7 上默认为字符串:

C:\Windows

检查环境变量

您可以验证PATH 环境标签的值:

  • 点击+R
  • 键入cmd 并按Enter。 (应该会打开一个命令行窗口。)
  • 输入或粘贴echo %path%,然后按Enter

WindowPATH环境变量的内容会显示出来。

您还可以在 Windows 中检查环境变量:

  • 并输入 env(搜索)
  • 点击Edit the system environment variables。 (有一个类似的选项“...for your account”,但完全不一样。)
  • 点击

注意:虽然您在技术上可以更改此窗口中的PATH我不建议这样做所以,尤其是PATH,因为它分为系统和用户文件夹,Windows 喜欢某些区域的某些文件夹,并且某些更改在重新启动之前不会生效,但其他更改会生效,等等等等等等,相信我:从命令行更容易做到。


你的代码有什么问题?

因此,基于所有这些,您尝试运行的命令似乎是:

Rscript "C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem/test.R"

...这显然行不通


获取或设置当前工作文件夹/目录

我只能推测你想要完成什么

我怀疑您不打算返回整个 PATH 变量,而是只对当前工作文件夹感兴趣。

如果是这样,您根本不需要指定文件夹Shell 已经在“当前”文件夹中执行命令。

您可以使用VBA CurDir() function 来检查哪个directory or folder 是最新的,例如:

Debug.Print CurDir()

CurDir 的值可以用the ChDir statement 更改。


类似功能

请注意,CurDur() 命令经常与类似的函数混淆,例如:


可能的解决方案:(如何在VBA的当前路径中运行rScript

  • 如果您的R 脚本和rscript.exe 在当前工作文件夹中,则只使用一行VBA 运行它:

    Shell "rscript.exe test.R", vbNormalFocus
    
  • 如果您需要 VBA 在恢复 VBA 之前等待完成 Shell 命令的执行,那么您可以只使用这一行:

    CreateObject("WScript.Shell").Run "rscript.exe test.R", vbNormalFocus, True
    

更多信息:

我通常会强调包含指向我用来验证我的答案的任何网站的链接,所以这一定是我的迄今为止研究最多的答案,因为我从来没有这个列表长...这次我漏掉了一些!



您的代码有什么问题的另一个演示:

我有一个名为test.bat 的批处理文件位于C:\WINDOWS。我的PATH 环境变量包含C:\WINDOWS(除其他外)。

如果我转到根文件夹C:\ 中的命令提示符并输入test.bat

...它运行正常(即使我的文件不在那个文件夹中...因为c:\windows 文件夹在PATH 变量中。)


然而,如果我进入命令提示符并输入C:\test.bat

...它确实工作。它找不到文件因为我指定文件所在的文件夹

--- 在 VBA 中,如果我运行命令 Shell "test.bat",1:

...它运行正常(即使我的文件不在那个文件夹中...因为c:\windows 文件夹在PATH 变量中。)


然而,如果在 VBA 中我运行命令 Shell "c:\test.bat",1:

...它确实工作。它找不到文件因为我指定了*文件所在的文件夹**。


当给定相同的信息时,VBA 和Shell 命令的行为相同

【讨论】:

  • 覆盖得很好!
  • 我在我的代码中只使用了一种编程语言,即 VBA。 path 只是为了隐藏类似于“C:/...”的实际路径。该命令在命令行中运行良好。我将编辑问题以使其更清晰
  • 正如您在我添加到问题中的图片中看到的那样,我正在运行,就像在普通 CMD 中运行一样。路径没有错...问题是 Shell 使用的 PATH 变量不包含系统环境 PATH 中的所有值。如果我使用调试运行代码的第二部分,则 wshSystemEnv("PATH") 包含 Rscript.exe 和 shell_obj.ExpandEnvironmentStrings("%PATH%") 的路径 没有。
【解决方案2】:

如果您最近修改了系统 PATH 变量,则必须重新启动运行 VBA 的 Office 应用程序。 VBA 向 WScript 发送路径变量,并且仅在重新启动时重新读取它。重新启动时,它将从系统中重新读取 PATH 变量并将新的正确路径发送到 WScript。

我有同样的问题。我已经更新了系统 PATH 变量,但是 WScript.Shell 对象是从 Excel 传递路径变量而不是从系统中读取的。 Excel 在启动时已读取路径,但不知道它已更改。一旦我关闭 Excel 并重新打开,WScript 就会更新路径变量并且我的脚本会成功执行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-24
    • 1970-01-01
    相关资源
    最近更新 更多