Не говоря уже о том, что кто-то здесь [вставьте здесь кашель с дискретным горлом] все еще использует Classic ASP для поддержки и поддержки устаревших приложений, но недавно у меня возникла необходимость сделать что-то подобное. Отказываясь от ответов «невозможно с классическим ASP», я решил найти способ и нашел следующее решение.
Этот подход в основном использует базовые команды ОС для буквального определения текущего имени файла (результат которого эквивалентен использованию магической константы __FILE__
в PHP) независимо от того, включает ли он файл (*.inc
) или сам скрипт (*.asp
).
Во-первых, для поддержки некоторой дезинфекции (вы можете сделать это другим, более «оптимальным» способом, если хотите):
'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
А теперь на время «отражения»:
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
Затем внутри любого файла, который вы хотите «проверить» текущим именем файла, просто удалите следующую строку, передавая некоторый уникальный идентификатор, который не должен существовать ни в каком другом файле в текущем каталоге, кроме этого:
'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
Удачного кодирования!