
De vez en cuando, encuentro que mis variables de entorno TEMP y TMP están configuradas en C:\Windows\TEMP
. Deben estar configurados en %USERPROFILE%\AppData\Local\Temp
y están configurados correctamente enPropiedades del sistema.
Esto se manifiesta como mensajes de error como el siguiente:
---> System.InvalidOperationException: Unable to generate a temporary class
(result=1).
error CS2001: Source file 'C:\Windows\TEMP\gb_pz65v.0.cs' could not be found
error CS2008: No inputs specified
...que ocurre en varias aplicaciones .NET (en particular Visual Studio 2010 o SQL Server Management Studio). Alternativamente, SQL Server Management Studio informará:
Value cannot be null.
Parameter name: viewInfo (Microsoft.SqlServer.Management.SqlStudio.Explorer)
Si ejecuto PowerShell elevado, entonces $env:TEMP
está configurado correctamente. Si ejecuto PowerShell no elevado, entonces no lo es. Creo que debería configurarse correctamente en ambos casos. Si no, es al revés.
Lo mismo ocurre con CMD.EXE.
Reiniciar lo soluciona, temporalmente, hasta quealgolo vuelve a romper. Presumiblemente, algo cargado en Explorer.exe está alterando sus variables de entorno, pero ¿qué?
Los valores en el registro son correctos, incluso mientras sucede esto:
HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment
tieneTEMP
=%SYSTEMROOT%\Temp
HKCU\Environment
tieneTEMP
=%USERPROFILE%\AppData\Local\Temp
Al establecer un punto de interrupción shell32!RegenerateUserEnvironment
con WinDbg, puedo detectarlo cuando sucede, pero todavía no sé por qué explorer.exe
leo las variables de entorno incorrectas.
Puedo reproducirlo consistentemente transmitiendo un WM_SETTINGCHANGE
mensaje (escribí un programa C++ de una línea para hacer esto). Observar la actividad en Process Monitor muestra que explorer.exe ni siquiera mira HKCU\Environment
.
¿Qué está pasando?
Respuesta1
me encontré con estoexactoEl mismo problema hace unas semanas y me ha estado volviendo loco. Creo que lo que lo está causando es una variable de ruta excesivamente larga. Encontré varios otros informes sobre variables de entorno "desaparecidas" en la web y algunas sugerencias de que estaba relacionado con un camino largo.
Eché un vistazo al mío y resultó que algunos instaladores con errores habían duplicado todas las entradas (algunas más de una vez). Debe haber un error de desbordamiento del búfer enterrado en explorer.exe en alguna parte. De todos modos, cuando eliminé los duplicados y presioné Aceptar, mi variable TEMP reapareció repentinamente (con el valor correcto) en todas las aplicaciones que inicié desde el explorador.
Respuesta2
Su perfil de usuario puede estar dañado. Intente cambiar el nombre de su perfil en C:\Users
Windows 7 y C:\Documents and Settings
Windows XP, luego reinicie e inicie sesión con las mismas credenciales para que se genere un nuevo perfil. Si eso funciona, puedes seleccionar tus archivos de tu perfil anterior y copiarlos a tu nuevo perfil.
Es extraño que hayas dicho que enviar un WM_SETTINGCHANGE
mensaje no funcionó; veresta página de soporte de Windowspara un ejemplo de C#/VB que debería funcionar. Además, vea si simplemente abre y hace clic en Aceptar en el cuadro de diálogo Variables de entorno haciendo clic derecho en el icono Mi PC en su escritorio, seleccionando Propiedades en el menú de opciones, luego la pestaña Avanzado y haciendo clic en el botón Variables de entorno. Esto carga las HKCU\Environment
variables para mí y para varios otros carteles.
Compruebe si sus HKCU\Volatile Environment
variables se generan cuando inicia sesión. Estos deberían incluir HOMEPATH
, HOMEDRIVE
, USERNAME
etc. ¿Falta por completo esa clave?
Si nada funciona, una solución alternativa para mí ha sido utilizar SETX
un archivo por lotes ubicado en la carpeta Inicio de todos los programas de usuarios en el menú Inicio. Para Windows XP, descárguelo SETX
como parte deHerramientas de soporte técnico de Windows XP Service Pack 2.
SET HOME=
SET HOME=%USERPROFILE%
SETX HOME "%HOME%"
Esto hará que sus HKCU\Environment
variables se lean al inicio. Luego combine las claves a continuación con su registro. Serán estáticos para todos los usuarios hasta que arregle su perfil, aunque uno podría inventar un archivo por lotes más sofisticado si así lo desea. Reemplazarnombre de usuario,servidor de inicio de sesiónydominio.Este ejemplo es para Windows XP.Guárdelo como un archivo .reg, haga clic derecho y seleccione fusionar. También puedes agregarlos usando SETX
. También puedes usar REG ADD
o REGEDIT
seguido de WM_SETTINGCHANGE
ya que estos comandos no actualizan tu entorno actual. VerSS64para el uso de comandos de SETX
, REG
y REGEDIT
.
Windows Registry Editor Version 5.00
[HKEY_CURRENT_USER\Volatile Environment]
"APPDATA"="C:\\Documents and Settings\\<username>\\Application Data"
"HOMEPATH"="\\Documents and Settings\\<username>"
"HOMEDRIVE"="C:"
"LOGONSERVER"="\\\\<logon-server>"
"USERDOMAIN"="<domain>"
"USERNAME"="<username>"
"USERPROFILE"="C:\\Documents and Settings\\<username>"
"USERDNSDOMAIN"="<domain.com>"
"LOCALAPPDATA"="C:\\Documents and Settings\\<username>\\Local Settings\\Application Data"
[HKEY_CURRENT_USER\Volatile Environment\2]
"CLIENTNAME"="Console"
"SESSIONNAME"=""