为什么从Excel VBA运行时VBScript从%userprofile%\ Documents运行?

短背景

我有一个应用程序,我在Excel中build立,我试图添加function,其中Excel作为一个控制器,并运行不同的VBScript文件(我知道这听起来像一个奇怪的情况,但忍受着我)。 为了testing这个概念,我写了一个简短的VBScript,简单地说就是脚本所在文件夹的path。

VBScript( run-from-excel.vbs

 Set fso = CreateObject("Scripting.FileSystemObject") scriptPath = fso.GetAbsolutePathName(".") WScript.Echo(scriptPath) 

使用cscript run-from-excel.vbs从控制台的正确目录中运行时,输出为: C:\Users\cmfonvi\dev\vbscript ,如预期的那样。

现在,为了整合Excel。 我写了一个简单的Sub ,通过控制台上的WScript运行一个VBScript文件。

VBA – Excel

 Sub runVBScript(filePath As String) Shell "wscript " & filePath, vbNormalFocus End Sub 

我现在用命令运行这个Sub

 runVBScript (ActiveWorkbook.Path & "\run-from-excel.vbs") 

(工作簿和VBScript目前在同一个目录下,所以这个工作)。 但是,产量并不像我预期的那样。 它打开的窗口输出C:\Users\cmfonvi\Documents ,这意味着运行VBScript的wscript进程在%userprofile%\Documents目录中被初始化。

我的问题是双重的:

  1. 这是为什么?
  2. 我怎样才能使控制台初始化在适当的目录(例如,在%userprofile%\Desktop )?

. (在你的VBScript代码中)是当前的工作目录。 ActiveWorkbook.Path (在您的VBA代码中)是包含活动工作簿的目录的path。 这两条路不一定是一样的。 如果您希望VBScript代码输出脚本所在的目录,则需要使用如下所示的内容:

 fso.GetParentFolderName(WScript.ScriptFullName) 

如果你想VBScript使用一个特定的工作目录,像这样改变它:

 Set sh = CreateObject("WScript.Shell") sh.CurrentDirectory = "C:\some\folder"