ASP clássico VBScript / - Existe alguma maneira de obter o seu próprio nome de arquivo por meio de programação?
-
19-08-2019 - |
Pergunta
Eu estava revendo alguns códigos antigos e encontrou o seguinte (foo.asp dentro):
Const ASP_FILENAME = "foo.asp" ' TODO: Update this to the name of this file (if changed)
A variável é utilizada apenas para erros de registro. (Ie. "Erro na foo.asp -. Não foi possível criar objeto xxxxx") Existe alguma maneira de evitar isso?
Obrigado!
Solução
A partir do Aspfaq.com agora extinta (graças a Archive.org ):
Como posso obter o nome do URL / página atual?
Este é bastante fácil, mas há duas partes.
Para obter o nome do arquivo atual, você pode usar qualquer um destes:
<%
Response.Write Request.ServerVariables("SCRIPT_NAME") & "<br>"
Response.Write Request.ServerVariables("PATH_INFO") & "<br>"
Response.Write Request.ServerVariables("URL") & "<br>"
%>
Para fazer esse caminho local (por exemplo, para usar com FileSystemObject), basta aplicar o método server.mappath () para o resultado.
Para obter o URL inteiro, incluindo o http: // ou https: // prefixo, você pode fazer isso:
<%
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
%>
Para obter o nome da página apenas, uso algo como isto:
<%
scr = Request.ServerVariables("SCRIPT_NAME") & "<br>"
if instr(scr,"/")>0 then
scr = right(scr, len(scr) - instrRev(scr,"/"))
end if
response.write scr
%>
Ou, sem a lógica IF:
<%
scr = Request.ServerVariables("SCRIPT_NAME") & "<br>"
loc = instrRev(scr,"/")
scr = mid(scr, loc+1, len(scr) - loc)
response.write scr
%>
Agora. Se o arquivo é um # include dentro de outro arquivo, os scripts acima irá produzir o nome do arquivo de chamada (desde que o arquivo incluído é primeiro integrado no roteiro chamado, então o ASP dentro de tudo é executado no contexto do 'pai ' Arquivo). Uma maneira que você pode contornar essa é a re-preencher uma variável current_filename antes de carregar cada arquivo de inclusão, por exemplo:
<%
current_filename = "filetoinclude.asp"
%>
<!--#include file='filetoinclude.asp'-->
(E não, não tente passar current_filename como uma variável para a directiva # include;. Ver artigo # 2042)
Então, em filetoinclude.asp:
<%
Response.Write "Current file: " & current_filename
%>
Claro, você poderia facilmente codificar o interior nome de cada arquivo de inclusão. Mas suponho que a solução seria um pouco derrotar o propósito de recuperar essa informação pelo menos um pouco de forma dinâmica.
Outras dicas
Você pôde analisar Request.ServerVariables("url")
para obter a parte nome do arquivo. Uma pesquisa no google encontrada este código , para o qual i não direito de crédito, que usa a variável de servidor SCRIPT_NAME que parece fazer mais sentido, na verdade, também de tomar qualquer url reescrever na conta que pode ser posto em prática:
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)
Eu não sei se server.mappath existe no asp tradicional, mas se assim for, você poderia usar se de saber o nome do arquivo página.
Não estou dizendo que alguém aqui [inserir discreta tosse pigarro aqui] ainda usa ASP clássico para manter e suportar aplicações legadas, mas recentemente tive a necessidade de fazer algo similar. Recusando-se a se contentar com o "É impossível com ASP clássico" respostas lá fora, me propus a encontrar um caminho e veio com a seguinte solução.
Esta abordagem basicamente utiliza comandos de sistema operacional subjacente para literalmente determinar o nome do arquivo atual (cujo resultado é equivalente a usar a constante __FILE__
mágica em PHP), independentemente de se tratar de um arquivo de inclusão (*.inc
) ou o script si (*.asp
).
Em primeiro lugar, para apoiar alguns sanitização (você pode fazer isso maneira alguma outra mais "ideal" se desejar):
'Regex helpers
Function NewRegex(ByVal pattern, ByVal ignore_case, ByVal global)
Set NewRegex = New RegExp
NewRegex.Pattern = pattern
NewRegex.IgnoreCase = ignore_case
NewRegex.Global = global
End Function
Function RegexMatch(ByVal pattern, ByVal subject)
RegexMatch = RegexMatches(subject, pattern, True, False)
End Function
Function RegexMatches(ByVal subject, ByVal pattern, ByVal ignore_case, ByVal global)
RegexMatches = NewRegex(pattern, ignore_case, global).Test(subject)
End Function
E agora para um tempo de "reflexão:"
Function GetCurrentFilename(ByVal uniqueId)
'1. Enforce uniqueId format
If Not RegexMatch("^[0-9a-f]+$", uniqueId) Then
Exit Function
End If
'2. Use findstr to scan "readable" files in current directory for uniqueId
Dim shell, cmd, process, fs, filename
Set shell = Server.CreateObject("WScript.Shell")
'See findstr /? for details on switches used below
'cmd = C:\Windows\system32\cmd.exe /c findstr /P /M /C:"uniqueId" "C:\Inetpub\wwwroot\includes\*"
cmd = shell.ExpandEnvironmentStrings("%COMSPEC%") & " /c findstr /P /M /C:""" & uniqueId & """ """ & Server.MapPath(".") & "\*"""
Set process = shell.Exec(cmd)
'3. Use Scripting.FileSystemObject to return the filename portion of the first result returned
Set fs = Server.CreateObject("Scripting.FileSystemObject")
GetCurrentFilename = fs.GetFileName(process.StdOut.ReadLine())
Set fs = Nothing
Set process = Nothing
Set shell = Nothing
End Function
Então, dentro de qualquer arquivo que você quer "inspecionar" o nome do arquivo atual, basta soltar a seguinte linha, passando em algum identificador único que não deveria existir em qualquer outro arquivo no diretório atual, mas esta:
'myfile.inc
Response.Write "This is in " & GetCurrentFilename("908ab098c")
O resultado:
This is in somefile.inc
Ah, e se você estiver interessado no que eu precisava usar isso para, aqui está o que parece utilizado em uma função ponto de interrupção simples:
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
De tal forma que, na Linha 20 do meu código, se eu queria para adicionar meu próprio ponto de interrupção, ele ficaria assim:
Breakpoint 20, "B0001", "Some debug output here"
Output:
[!] Breakpoint hit at Line 20 in somefile.inc: Some debug output here
Happy codificação!