vbscript / ASP الكلاسيكية - هل هناك أي طريقة للحصول على الملف الخاص بك اسم برمجيا ؟
-
19-08-2019 - |
سؤال
أنا كنت أراجع بعض القانون القديم و وجدت التالي (داخل فو.asp):
Const ASP_FILENAME = "foo.asp" ' TODO: Update this to the name of this file (if changed)
متغير يستخدم فقط في تسجيل الأخطاء.(ie."خطأ في فو.asp - لا يمكن إنشاء xxxxx كائن.") هل هناك أي طريقة لتجنب هذا ؟
وذلك بفضل!
المحلول
من المنحل Aspfaq.com (شكرا Archive.org):
كيف يمكنني الحصول على اسم الحالية URL / الصفحة ؟
هذا هو واحد من السهل جدا, ولكن هناك قسمين.
لاسترداد اسم الملف الحالي ، يمكنك استخدام أي من هذه:
<%
Response.Write Request.ServerVariables("SCRIPT_NAME") & "<br>"
Response.Write Request.ServerVariables("PATH_INFO") & "<br>"
Response.Write Request.ServerVariables("URL") & "<br>"
%>
لجعل هذا المسار المحلية (على سبيل المثال ، لاستخدام FileSystemObject) ، مجرد تطبيق الملقم.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
%>
أو دون إن المنطق:
<%
scr = Request.ServerVariables("SCRIPT_NAME") & "<br>"
loc = instrRev(scr,"/")
scr = mid(scr, loc+1, len(scr) - loc)
response.write scr
%>
الآن.إذا كان الملف الخاص بك هو #INCLUDE داخل ملف آخر ، فوق البرامج النصية سوف تنتج اسم استدعاء ملف (منذ إدراج الملف المتكامل الأول في استدعاء البرنامج النصي ، ثم ASP في كل ذلك هو من أعدم في سياق 'الأم' الملف).طريقة واحدة يمكنك أن هذا هو إعادة تعبئة current_filename متغير قبل التحميل تشمل كل الملفات ، على سبيل المثال:
<%
current_filename = "filetoinclude.asp"
%>
<!--#include file='filetoinclude.asp'-->
(و لا تحاول current_filename كمتغير إلى #تشمل التوجيه ؛ انظر المادة #2042.)
ثم في filetoinclude.asp:
<%
Response.Write "Current file: " & current_filename
%>
بالطبع يمكنك بسهولة مثلما بجد رمز الملف داخل كل ملف.ولكن أعتقد أن هذا الحل إلى حد ما يضعف الغرض من استرجاع هذه المعلومات على الأقل إلى حد ما بشكل حيوي.
نصائح أخرى
هل يمكن تحليل Request.ServerVariables("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)
وأنا لا أعرف ما إذا كان يوجد server.mappath في آسيا والمحيط الهادئ التقليدي، ولكن إذا كان الأمر كذلك هل يمكن أن تستخدم إذا كان لمعرفة اسم الصفحة.
لا أقول أن أي شخص هنا [إدراج منفصلة تطهير الحلق والسعال هنا] لا يزال يستخدم ASP الكلاسيكية المحافظة على دعم التطبيقات القديمة, لكن في الآونة الأخيرة بحاجة إلى أن تفعل شيئا من هذا القبيل.رفض تسوية "من المستحيل مع ASP الكلاسيكية" الردود هناك ، أردت أن أجد طريقة و جاء مع الحل التالي.
هذا النهج الأساس روافع الأساسية OS الأوامر حرفيا تحديد اسم الملف الحالي (الذين النتيجة تعادل باستخدام __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
سعيد الترميز!