【问题标题】:Getting current directory in VBScript在 VBScript 中获取当前目录
【发布时间】:2013-04-14 20:47:26
【问题描述】:

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

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


    【解决方案1】:

    在代码中使用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
    

    【讨论】:

      【解决方案2】:

      您的问题是没有获取目录(fso.GetAbsolutePathName(".") 可以很好地解析当前工作目录)。即使您想要脚本目录而不是当前工作目录,您也可以很容易地确定,正如 Jakob Sternberg 在 his answer 中所描述的那样。

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

      Directory = <strike>CurrentDirectory\attribute.exe</strike>

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

      Directory = CurrentDirectory & "\attribute.exe"
      

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

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

      【讨论】:

      • 甚至不知道你可以投票但我没有把它放在那里
      • 我的脚本中没有设置这个属性。
      • @sirdank 我不知道您在说什么属性,因为我的回答中没有提到任何属性。需要解释一下吗?
      • @AnsgarWiechers 抱歉,我是个白痴。我现在从对问题的更仔细检查中看到,您并不是在暗示 CurrentDirectory 是持有 CWD 的全局财产,而是 OP 错误地构建了他的路径。我通过浏览下面的问题和答案感到困惑。我会继续尝试撤回我的反对票,但现在它说我的投票已锁定。
      • 一旦投票被锁定,在再次编辑答案之前您无法撤回它。从现在开始投票之前,请确保您完全理解答案。
      【解决方案3】:

      简单:

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

      【讨论】:

      • 当前目录 脚本目录;至少两个“使用 ScriptFullName”答案的副本;最糟糕的做法:替换而不是 .GetParentFolderName()。
      【解决方案4】:

      您可以使用WScript.ScriptFullName,它将返回执行脚本的完整路径


      然后您可以使用字符串操作(jscript 示例):

      scriptdir = WScript.ScriptFullName.substring(0,WScript.ScriptFullName.lastIndexOf(WScript.ScriptName)-1)
      


      或从 FileSystemObject 获得帮助,(vbscript 示例):

      scriptdir = CreateObject("Scripting.FileSystemObject").GetParentFolderName(WScript.ScriptFullName)
      

      【讨论】:

      • 第一个例子需要小修正:WScript.ScriptFullName.substring(0,WScript.ScriptFullName.lastIndexOf(WScript.ScriptName) - 1)
      • VBScript 中最简单的:WScript.Echo Mid(WScript.ScriptFullName, 1, (Len(WScript.ScriptFullName) - Len(WScript.ScriptName)))
      • 既然 OP 询问了 VBScript,我想提醒读者注意 Jakob 的第一行代码,这是一个 JScript 示例。它在 VBScript 中工作,因为 .substring 是对象的方法,但 WScript.FullScriptName 只是 VBScript 中的文字字符串而不是对象。 @ndemarco 在我上面的评论效果很好。
      【解决方案5】:
      '-----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
      

      【讨论】:

      • 你能解释一下你做了什么吗? (给一个人一条鱼——喂他一天,教一个人钓鱼——喂他一辈子。)
      • VBScript 可用于多种不同的环境(例如,经典 ASP、Windows 脚本宿主、HTML 应用程序(通过 IE))。这个 sn-p 代码将创建一个具有“Path”属性的对象“App”。如果将其粘贴在脚本中,则可以像在 VB6 中一样在代码中简单地使用“App.Path”。 (“为人生火,他会温暖一天。让一个人着火,他会在余生中保持温暖。”)
      【解决方案6】:

      您可以使用CurrentDirectory 属性。

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

      【讨论】:

      • 注意:这会返回执行脚本的目录,而不一定是脚本本身的目录。
      • 例如,如果您将文件拖放到运行脚本的 batfile 上,那么 workingdir 将是该文件的目录。
      【解决方案7】:

      你的线路

      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
      

      【讨论】:

      • 对于该行Directory = CurrentDirectory\attribute.exe 我试图设置一个变量。我想它不起作用。至于这段代码WinScriptHost.Run curDir &amp; "\testme.bat", 1,我需要它来完成它的工作并在没有命令窗口的情况下运行我的批处理应用程序文件。
      猜你喜欢
      • 1970-01-01
      • 2011-04-27
      • 1970-01-01
      • 2013-01-29
      • 2012-01-29
      • 2020-06-03
      • 2012-12-12
      • 1970-01-01
      相关资源
      最近更新 更多