在 VBScript 中获取当前目录

问题描述 投票:0回答:9

我正在尝试获取当前目录并使用它来运行应用程序,无论文件放在哪里以及路径如何更改

Dim fso: set fso = CreateObject("Scripting.FileSystemObject")
Dim CurrentDirectory
CurrentDirectory = fso.GetAbsolutePathName(".")
Dim Directory
Directory = CurrentDirectory\attribute.exe

Set WinScriptHost = CreateObject("WScript.Shell")
WinScriptHost.Run Chr(34) & "Directory" & Chr(34), 0
Set WinScriptHost = Nothing

我如何实际设置此代码,以便它正确执行我希望它执行的操作?

vbscript directory
9个回答
58
投票

您可以(应该!)使用 WScript.ScriptFullName,它返回 执行脚本的完整路径。

然后您可以使用字符串操作或 FileSystemObject 来获取父路径。两种方法都会返回所需的结果,唯一的区别是如果路径不存在,FileSystemObject 将抛出错误。 ..并且意识到可能的错误是一件好事;)


VBScript

  • 使用字符串操作:
' VBscript string manipulation
scriptDir = Left(WScript.ScriptFullName, InStrRev(WScript.ScriptFullName, "\") - 1)
  • 或使用 FileSystemObject
' VBscript FileSystemObject
scriptDir = CreateObject("Scripting.FileSystemObject").GetParentFolderName(WScript.ScriptFullName)

JScript 版本:

// JScript string manipulation
var scriptdir = WScript.ScriptFullName.substring(0,WScript.ScriptFullName.lastIndexOf("\\"))
// JScript using FileSystemObject
scriptDir = CreateObject("Scripting.FileSystemObject").GetParentFolderName(WScript.ScriptFullName)

这就是您所需要的;)


不要使用 fso.GetAbsolutePathName(".")wShell.CurrentDirectory

使用它们的问题是它们都返回当前的

working directory
。是的,如果您只需双击该文件,它就可以正常工作,但如果从其他位置调用该文件,那么工作目录很可能是其他目录。

如果您在控制台中执行此操作:

C:\Users>cscript //nologo "C:\myscripts\cool.vbs"

那么你的工作目录将是

C:\Users

如果将文件拖放到 vbs 文件上(使用文件参数在 WScript 中启动脚本),则工作目录将为

C:\Windows\System32
(即使拖放的文件与 vbs 脚本位于同一目录中。)

我希望这有帮助。


32
投票

您可以使用 CurrentDirectory 属性。

Dim WshShell, strCurDir
Set WshShell = CreateObject("WScript.Shell")
strCurDir    = WshShell.CurrentDirectory
WshShell.Run strCurDir & "\attribute.exe", 0
Set WshShell = Nothing

25
投票

您的问题是没有获取目录(

fso.GetAbsolutePathName(".")
可以很好地解析当前工作目录)。即使您想要脚本目录而不是当前工作目录,您也可以轻松确定,如 Jakob Sternberg 在他的答案中所述。

在您的代码中不起作用的是从目录和可执行文件构建路径。这是无效语法:

Directory = CurrentDirectory\attribute.exe

如果要从变量和文件名构建路径,则必须将文件名指定为字符串(或包含字符串的变量)并与变量目录变量连接:

Directory = CurrentDirectory & "\attribute.exe"

或者(更好)您使用 BuildPath 方法构造路径:

Directory = fso.BuildPath(CurrentDirectory, "attribute.exe")

8
投票
'-----Implementation of VB6 App object in VBScript-----
Class clsApplication
    Property Get Path()
          Dim sTmp
          If IsObject(Server) Then
               'Classic ASP
               Path = Server.MapPath("../")
          ElseIf IsObject(WScript) Then 
               'Windows Scripting Host
               Path = Left(WScript.ScriptFullName, InStr(WScript.ScriptFullName, WScript.ScriptName) - 2)
          ElseIf IsObject(window) Then
               'Internet Explorer HTML Application (HTA)
               sTmp = Replace( Replace(Unescape(window.location), "file:///", "") ,"/", "\")
               Path = Left(sTmp, InstrRev( sTmp , "\") - 1)
          End If
    End Property
End Class
Dim App : Set App = New clsApplication 'use as App.Path

5
投票

你的线路

Directory = CurrentDirectory\attribute.exe

与我在 vbscript 说明手册中遇到的任何功能都不匹配。 以下内容对我有用,但不确定您期望“attribute.exe”驻留在什么/哪里。

dim fso
dim curDir
dim WinScriptHost
set fso = CreateObject("Scripting.FileSystemObject")
curDir = fso.GetAbsolutePathName(".")
set fso = nothing
Set WinScriptHost = CreateObject("WScript.Shell")
WinScriptHost.Run curDir & "\testme.bat", 1
set WinScriptHost = nothing

2
投票

在代码中使用 With

试试这个方法:

''''Way 1

currentdir=Left(WScript.ScriptFullName,InStrRev(WScript.ScriptFullName,"\"))


''''Way 2

With CreateObject("WScript.Shell")
CurrentPath=.CurrentDirectory
End With


''''Way 3

With WSH
CD=Replace(.ScriptFullName,.ScriptName,"")
End With

1
投票

简单:

scriptdir = replace(WScript.ScriptFullName,WScript.ScriptName,"")

0
投票

2个最简单的方法:

  1. Replace(WScript.ScriptFullName, WScript.ScriptName, "")
  2. Left(WScript.ScriptFullName, InStrRev(WScript.ScriptFullName, "\"))

0
投票
wscript.echo Mid(WScript.ScriptFullName,1,InStrRev(WScript.ScriptFullName, "\"))
© www.soinside.com 2019 - 2024. All rights reserved.