2010-12-21 20 views
6

¿Hay alguna variable de entorno u otro formato que la ruta del perfil se represente en Windows? Quiero consultar de tal manera que debería obtener el valor "C: \ Documents and Settings (si Windows XP o 2k3) o C: \ users (Si vista o Windows 7).¿Hay alguna variable de entorno que represente la carpeta "C: Documents and Settings" o la carpeta C: Users en Windows?

No quiero la corriente nombre de usuario anexa a la cadena, lo que puedo conseguir a través de la variable% USERPROFILE%

+3

Como se puede poner en cualquier lugar, por ejemplo, perfiles de usuario usted puede configurar el marcado como c: \ mark ¿por qué necesita esto y no USERPROFILE? También tenga en cuenta que el último directorio no es necesariamente el mismo que el nombre de usuario. – Mark

+0

Sí Mark ... Lo que dijiste es verdad. Solo quiero saber dónde se encuentra un perfil de usuario en particular? Además, mi entorno no 'redirecciona' estos perfiles además de las ubicaciones predeterminadas. – svv

Respuesta

9

no existe lugar, trate %USERPROFILE%\..

Advertencia:.. como sugiere @ Marcos, esto no es confiable debido a que el perfil de usuario directorio realmente puede ser cualquier ubicación arbitraria.

+0

El% USERPROFILE% agregará el nombre de usuario actual. Quiero usarlo para un nombre de usuario diferente. Todavía puedo hacerlo con un código adicional en mi script. Pero solo quiero saber si hay alguna forma mejor de hacerlo. – svv

+0

el directorio de perfil de otro usuario no es necesariamente% userprofile% \ .. \ otheruser. Pero si está seguro de que lo es, entonces sí, tendrá que actualizarlo en su script manualmente. – tenfour

+0

@svv: ¿Cómo sabe que el otro usuario tiene su directorio de perfil en una ubicación similar? –

2

A lo mejor de mi conocimiento, pero puede hacer una última instancia de '/' para encontrar el padre de% USERPROFILE%

3

En Vista + puede usar FOLDERID_UserProfiles para obtener C: \ Users (o lo que sea en versiones localizadas, etc.). En XP y anteriores, tendrá que ir a la ruta CSIDL_COMMON_DESKTOPDIRECTORY que le dará "C: \ Documents and Settings \ All Users \ Desktop" y volverá desde allí.

Creo que esto lo resuelve para Vista. Para XP, la solución no es perfecta, pero al menos no dependerá de la ruta del perfil del usuario actual. "Todos los usuarios" siempre existirán, y no puedo pensar en una razón para que esté en un lugar que no sea el predeterminado.

+3

Creo que el método preferido sería GetProfilesDirectory (http://msdn.microsoft.com/en-us/library/bb762278.aspx). – Luke

+0

@Luke: Wow. ¿Cómo diablos sacaste esa API oscura de tu cabeza? – martona

+0

Siempre me gusta las reacciones de las personas a la existencia de esta función. Supongo que como está aislado en UserEnv en lugar de agruparse con todas las otras funciones de ruta en Shell32, la gente tiende a no saberlo. – Luke

2

Sí existe en realidad es una manera de conseguir que funcione:

%USERPROFILE%\.. 
0

que derivan los métodos por lotes y VBS (abajo), ya que no pude encontrar un lote equivalente o método VBS para esta pregunta en cualquier parte más. Si no debo agregarlo a este hilo (jscript), agregue un comentario sobre cómo/dónde debería ir, y borraré esta respuesta y la publicaré como se indica. :)

por lotes (sola línea - sin retorno de carro):

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) 
Cuestiones relacionadas