Asp classic vbscript/Classic ASP-是否有任何方法可以通过编程方式获取自己的文件名?

Asp classic vbscript/Classic ASP-是否有任何方法可以通过编程方式获取自己的文件名?,asp-classic,vbscript,filenames,Asp Classic,Vbscript,Filenames,我刚刚查看了一些旧代码,发现了以下内容(在foo.asp中): 该变量仅用于记录错误。(即“foo.asp中的错误-无法创建xxxxx对象”)有没有办法避免这种情况 谢谢 您可以解析Request.ServerVariables(“url”)以获取文件名部分。一个谷歌搜索发现,我不认为这是一个功劳,它使用了SCRIPT_NAME server变量,这似乎更有意义,还考虑了可能发生的任何url重写: function getFileName(fpath, returnExtension)

我刚刚查看了一些旧代码,发现了以下内容(在foo.asp中):

该变量仅用于记录错误。(即“foo.asp中的错误-无法创建xxxxx对象”)有没有办法避免这种情况


谢谢

您可以解析
Request.ServerVariables(“url”)
以获取文件名部分。一个谷歌搜索发现,我不认为这是一个功劳,它使用了SCRIPT_NAME server变量,这似乎更有意义,还考虑了可能发生的任何url重写:

function getFileName(fpath, returnExtension)
        tmp = fpath
        if instrRev(tmp,"/") > 0 then
              tmp = mid(tmp, instrRev(tmp,"/")+1)
        end if
        if returnExtension = false then
              if instrRev(tmp,".") > 0 then
                    tmp = left(tmp, instrRev(tmp,".")-1)
              end if
        end if
        getFileName = tmp
  end function

  filename = request.ServerVariables("SCRIPT_NAME")
  Const ASP_FILENAME = getFileName(filename, true)

我不知道传统asp上是否存在server.mappath,但如果存在,您可以使用if来了解页面文件名。

来自现已不存在的Aspfaq.com(感谢):

如何获取当前URL/页面的名称?

这个很简单,但是有两个部分

要检索当前文件的名称,可以使用以下任一选项:

<% 
    Response.Write Request.ServerVariables("SCRIPT_NAME") & "<br>" 
    Response.Write Request.ServerVariables("PATH_INFO") & "<br>" 
    Response.Write Request.ServerVariables("URL") & "<br>" 
%>

要使该路径成为本地路径(例如,用于FileSystemObject),只需对结果应用server.mappath()方法

要获取整个URL,包括http://或https://前缀,可以执行以下操作:

<% 
    prot = "http" 
    https = lcase(request.ServerVariables("HTTPS")) 
    if https <> "off" then prot = "https" 
    domainname = Request.ServerVariables("SERVER_NAME") 
    filename = Request.ServerVariables("SCRIPT_NAME") 
    querystring = Request.ServerVariables("QUERY_STRING") 
    response.write prot & "://" & domainname & filename & "?" & querystring 
%>

要仅获取页面名称,请使用类似以下内容:

<% 
    scr = Request.ServerVariables("SCRIPT_NAME") & "<br>" 
    if instr(scr,"/")>0 then 
        scr = right(scr, len(scr) - instrRev(scr,"/")) 
    end if 
    response.write scr 
%>
0那么
scr=右侧(scr,透镜(scr)-仪表板(scr,“/”)
如果结束
response.write scr
%>
或者,如果没有IF逻辑:

<% 
    scr = Request.ServerVariables("SCRIPT_NAME") & "<br>" 
    loc = instrRev(scr,"/") 
    scr = mid(scr, loc+1, len(scr) - loc) 
    response.write scr 
%>

现在。如果您的文件是另一个文件中的#INCLUDE,则上述脚本将生成调用文件的名称(因为包含的文件首先集成到调用脚本中,然后其中的ASP都在“父”文件的上下文中执行)。解决此问题的一种方法是在加载每个包含文件之前重新填充当前的_filename变量,例如:

<% 
      current_filename = "filetoinclude.asp" 
 %> 

<!--#include file='filetoinclude.asp'-->

(不,不要尝试将当前的_文件名作为变量传递给#INCLUDE指令;请参阅文章#2042。)

然后,在filetoinclude.asp中:

<% 
    Response.Write "Current file: " & current_filename 
%>


当然,您也可以轻松地在每个include文件中硬编码文件名。但我认为该解决方案会在某种程度上违背检索该信息的目的,至少在某种程度上是动态的。

这里并不是说这里的任何人[在这里插入离散的咽喉清除器]仍然使用经典的ASP来维护和支持遗留应用程序,但我最近需要做一些类似的事情。我拒绝接受“经典ASP不可能”的回答,我开始寻找一种方法,并提出了以下解决方案

这种方法基本上利用底层操作系统命令来确定当前文件名(其结果相当于在PHP中使用
\uuuu FILE\uuuuu
魔法常量),而不管它是文件include(
*.inc
)还是脚本本身(
*.asp

首先,为了支持一些消毒(如果您愿意,您可以通过其他更“最优”的方式进行):

现在是“反思”的时刻:

然后,在要“检查”当前文件名的任何文件中,只需删除以下行,传入一些唯一标识符,该标识符不应存在于当前目录中的任何其他文件中,但应存在于此文件中:

'myfile.inc
Response.Write "This is in " & GetCurrentFilename("908ab098c")
结果是:

This is in somefile.inc
哦,如果您对我需要使用它的目的感兴趣,下面是在一个简单的断点函数中使用它的情况:

Function Breakpoint(ByVal line_no, ByVal uniqueId, ByVal msg)
  Dim fn
  fn = GetCurrentFilename(uniqueId)

  Response.Write "[!] Breakpoint hit at Line " & CLng(line_no) & " in " & fn & ": " & Server.HtmlEncode(msg) & vbNewLine
  Response.End
End Function
这样,在代码的第20行,如果我想添加自己的断点,它将如下所示:

Breakpoint 20, "B0001", "Some debug output here"
输出:

[!] Breakpoint hit at Line 20 in somefile.inc: Some debug output here

快乐编码

当前Url当前文件名。例如,它可能是一个包含文件。如果这是OP的一个问题,本网站也建议了一种处理该场景的方法。请参阅下面我的答案,了解经典ASP中的
\uuuuuu文件\uuuuuuuuu
魔法常量等效物:)这看起来像是毫无目的的大量工作。如果我必须在每个文件中手动放置一个唯一的标识符,为什么不将标识符设置为“myfilename.asp”?文件的全部要点是,你可以把它放在任何地方,它就会自己发现。(例如,在可以在任意数量的文件中运行的函数中)
Function Breakpoint(ByVal line_no, ByVal uniqueId, ByVal msg)
  Dim fn
  fn = GetCurrentFilename(uniqueId)

  Response.Write "[!] Breakpoint hit at Line " & CLng(line_no) & " in " & fn & ": " & Server.HtmlEncode(msg) & vbNewLine
  Response.End
End Function
Breakpoint 20, "B0001", "Some debug output here"
[!] Breakpoint hit at Line 20 in somefile.inc: Some debug output here