vbscript / ASP الكلاسيكية - هل هناك أي طريقة للحصول على الملف الخاص بك اسم برمجيا ؟

StackOverflow https://stackoverflow.com/questions/450552

  •  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

سعيد الترميز!

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top