Asp classic vbscript/Classic ASP-是否有任何方法可以通过编程方式获取自己的文件名?
我刚刚查看了一些旧代码,发现了以下内容(在foo.asp中): 该变量仅用于记录错误。(即“foo.asp中的错误-无法创建xxxxx对象”)有没有办法避免这种情况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)
谢谢 您可以解析
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