【问题标题】:Is there any environment variable that represents "C:\Documents and Settings" folder or C:\Users folder in Windows?是否有任何环境变量代表 Windows 中的“C:\Documents and Settings”文件夹或 C:\Users 文件夹?
【发布时间】:2011-05-29 02:08:09
【问题描述】:

是否有任何环境变量或其他格式在 Windows 中表示配置文件路径?我想以这样的方式查询,我应该得到值“C:\Documents and Settings(如果是 windows XP 或 2k3)或 C:\users(如果是 vista 或 windows 7)。

我不希望将当前用户名附加到字符串中,我可以通过 %USERPROFILE% 变量获得。

【问题讨论】:

  • 因为您可以将用户配置文件放在任何地方,例如您可以将标记设置为 c:\mark 为什么需要这个而不是 USERPROFILE ?另请注意,最后一个目录不一定与用户名相同。
  • 是的,马克.. 你说的是真的。我只想知道特定用户配置文件的位置?此外,除了默认位置之外,我的环境不会“重定向”这些配置文件。

标签: windows environment-variables javascript


【解决方案1】:

它不存在。相反,请尝试%USERPROFILE%\..

警告:正如@Mark 建议的那样,这是不可靠的,因为用户配置文件目录实际上可能是任意位置。

【讨论】:

  • %USERPROFILE% 将附加当前用户名。我想将它用于不同的用户名。我仍然可以通过脚本中的一些附加代码来做到这一点。但只是想知道有没有更好的方法来做到这一点。
  • 另一个用户的配置文件目录不一定是 %userprofile%\..\otheruser。但如果你确定它是,那么是的,你将不得不在你的脚本中手动启动它。
  • @svv:你怎么知道其他用户的个人资料目录在类似的位置?
  • 匿名,正如我上面提到的,我的设置环境不会对用户配置文件进行任何重定向。它们只是 Windows 的默认设置。
【解决方案2】:

据我所知,没有;但是你可以做一个'/'的最后一个实例来找到%USERPROFILE%的父目录

【讨论】:

    【解决方案3】:

    在 Vista+ 上,您可以使用 FOLDERID_UserProfiles 来获取 C:\Users(或本地化版本中的任何内容等)。在 XP 和更早版本上,您几乎必须走 CSIDL_COMMON_DESKTOPDIRECTORY 路线,该路线将为您提供“C:\Documents and Settings\All Users\Desktop”并从那里返回。

    我认为这为 Vista 解决了问题。对于 XP,该解决方案并不完美,但至少它不会依赖于当前用户的配置文件路径。 “所有用户”将永远存在,我想不出有什么理由让它出现在默认位置之外。

    【讨论】:

    • 我认为首选方法是 GetProfilesDirectory (msdn.microsoft.com/en-us/library/bb762278.aspx)。
    • @Luke:哇。你到底是怎么把那个晦涩难懂的 API 从脑海中抽出来的?
    • 我总是对人们对这个功能的存在的反应感到兴奋。我猜是因为它被隔离到 UserEnv 中,而不是与 Shell32 中的所有其他路径函数组合在一起,所以人们往往不知道它。
    【解决方案4】:

    是的,实际上有一种方法可以让它工作:

    %USERPROFILE%\..
    

    【讨论】:

    • 投反对票,因为这个答案对 tenfour 的建议没有任何新意。请考虑删除它
    【解决方案5】:

    我导出了批处理和 VBS 方法(如下),因为我在其他任何地方都找不到针对此问题的等效批处理或 VBS 方法。如果我不应该将它添加到这个线程(jscript),请添加关于它应该如何/去哪里的评论,我将删除这个答案并按照指示发布。 :)

    批处理(单行 - 无回车):

    for /f "tokens=2*" %%f in ('reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList" /v ProfilesDirectory ^|find /i "Profiles"') do @set ProfDir=%%g
    

    VBScript:

    ' http://www.activexperts.com/activmonitor/windowsmanagement/adminscripts/registry/#ListRegFiles.htm
    
    const HKEY_LOCAL_MACHINE = &H80000002
    strComputer = "."
    Set StdOut = WScript.StdOut
    
    Set oReg=GetObject("winmgmts:{impersonationLevel=impersonate}!\\" &_
    strComputer & "\root\default:StdRegProv")
    strKeyPath = "SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList"
    oReg.EnumValues HKEY_LOCAL_MACHINE, strKeyPath,_
     arrValueNames, arrValueTypes
    
    For i=0 To UBound(arrValueNames)
    '    StdOut.WriteLine "File Name: " & arrValueNames(i) & " -- "
        oReg.GetStringValue HKEY_LOCAL_MACHINE,strKeyPath,_
        arrValueNames(i),strValue
    '    StdOut.WriteLine "Location: " & strValue
    '    StdOut.WriteBlankLines(1)
        IF arrValueNames(i) = "ProfilesDirectory" THEN ProfileRoot= strValue
    Next
    
    wscript.echo("ProfileRoot=" & ProfileRoot)
    

    【讨论】:

      猜你喜欢
      • 2016-04-25
      • 2010-11-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-19
      相关资源
      最近更新 更多