是否存在表示“的环境变量”;C:\Documents and Settings";Windows中的文件夹或C:\Users文件夹?

是否存在表示“的环境变量”;C:\Documents and Settings";Windows中的文件夹或C:\Users文件夹?,windows,environment-variables,javascript,Windows,Environment Variables,Javascript,在Windows中是否存在表示配置文件路径的任何环境变量或其他格式?我希望以这样一种方式进行查询,即获得值“C:\Documents and Settings(如果是windows XP或2k3)或C:\users(如果是vista或windows 7) 我不想将当前用户名附加到字符串中,我可以通过%USERPROFILE%变量获取该字符串。它不存在。请尝试%USERPROFILE%\.. 警告:正如@Mark所建议的,这是不可靠的,因为用户配置文件目录实际上可能是任意位置。据我所知,没有;但您

在Windows中是否存在表示配置文件路径的任何环境变量或其他格式?我希望以这样一种方式进行查询,即获得值“C:\Documents and Settings(如果是windows XP或2k3)或C:\users(如果是vista或windows 7)


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

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


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

据我所知,没有;但您可以执行“/”的最后一个实例,在Vista+上查找
%USERPROFILE%

的父目录,您可以使用FOLDERID\u UserProfiles获取C:\Users在XP和更早的版本中,您几乎必须使用CSIDL_COMMON_DESKTOPDIRECTORY路径,该路径将为您提供“C:\Documents and Settings\All Users\Desktop”,然后从那里返回


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

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

%USERPROFILE%\..

我派生了批处理和VBS方法(如下),因为我在其他任何地方都找不到该问题的等效批处理或VBS方法。如果我不应该将其添加到此线程(jscript),请添加一条关于它应该如何/在哪里的注释,我将删除此答案并按指示发布。:)

批次(单行-无回车):

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)

因为你可以将用户配置文件放在任何地方,例如,你可以将标记设置为c:\mark为什么你需要这个而不是USERPROFILE?还要注意最后一个目录不一定与用户名相同。是的,标记..你所说的是真的。我只想知道特定的用户配置文件位于何处?而且我的环境不会“重定向”这些配置文件r多于默认位置。%USERPROFILE%将附加当前用户名。我想将其用于其他用户名。我仍然可以通过脚本中的一些附加代码来完成。但我只想知道是否有更好的方法来完成此操作。其他用户的配置文件目录不一定是%USERPROFILE%\..\otheruser。但如果您确定是,则是y您必须在脚本中手动调整它。@svv:您如何知道其他用户的配置文件目录位于类似的位置?另外,正如我上面提到的,我的安装环境不会对用户配置文件进行任何重定向。它们只是windows默认设置。我想首选的方法是GetProfilesDirectory()@Luke:Wow.你到底是怎么把那个晦涩难懂的API从你的脑海中拉出来的?我总是能从人们对这个函数存在的反应中得到启发。我猜,因为它是一种隔离到UserEnv中的函数,而不是与Shell32中的所有其他路径函数组合在一起,所以人们往往不知道它。向下投票因为这个答案没有任何意义TAN4提出的新建议。请考虑删除它。
' 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)