
Ocasionalmente, encontro minhas variáveis de ambiente TEMP e TMP definidas como C:\Windows\TEMP
. Eles devem ser definidos como %USERPROFILE%\AppData\Local\Temp
e estão configurados corretamente emPropriedades do sistema.
Isso se manifesta como mensagens de erro como as seguintes:
---> 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 ocorre em vários aplicativos .NET (em particular Visual Studio 2010 ou SQL Server Management Studio). Como alternativa, o SQL Server Management Studio reportará:
Value cannot be null.
Parameter name: viewInfo (Microsoft.SqlServer.Management.SqlStudio.Explorer)
Se eu executar o PowerShell elevado, ele $env:TEMP
estará configurado corretamente. Se eu executar o PowerShell não elevado, não será. Acredito que deve ser configurado corretamente em ambos os casos. Se não, é o contrário.
O mesmo se aplica ao CMD.EXE.
A reinicialização corrige isso, temporariamente, atéalgoquebra novamente. Presumivelmente, algo carregado no Explorer.exe está mexendo com suas variáveis de ambiente, mas o quê?
Os valores no registro estão corretos, mesmo enquanto isso acontece:
HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment
temTEMP
=%SYSTEMROOT%\Temp
HKCU\Environment
temTEMP
=%USERPROFILE%\AppData\Local\Temp
Ao definir um ponto de interrupção shell32!RegenerateUserEnvironment
com o WinDbg, consigo capturá-lo quando isso acontece, mas ainda não sei por que explorer.exe
está lendo as variáveis de ambiente erradas.
Posso reproduzi-lo de forma consistente transmitindo uma WM_SETTINGCHANGE
mensagem (escrevi um programa C++ de uma linha para fazer isso). Observar a atividade no Process Monitor mostra que o explorer.exe nem sequer olha para o arquivo HKCU\Environment
.
O que está acontecendo?
Responder1
Eu encontrei issoexatomesmo problema há algumas semanas e isso está me deixando maluco. Acho que o que está causando isso é uma variável de caminho excessivamente longa. Encontrei vários outros relatórios de variáveis de ambiente "desaparecidas" na web e algumas sugestões de que isso estava relacionado a um longo caminho.
Dei uma olhada no meu e descobri que alguns instaladores com bugs duplicaram todas as entradas (alguns mais de uma vez). Deve haver um bug de saturação de buffer enterrado em explorer.exe em algum lugar. De qualquer forma, quando removi as duplicatas e cliquei em OK, minha variável TEMP reapareceu repentinamente (com o valor correto) em todos os aplicativos que iniciei no Explorer.
Responder2
Seu perfil de usuário pode estar corrompido. Tente renomear seu perfil no C:\Users
Windows 7 e C:\Documents and Settings
no Windows XP e, em seguida, reinicie e faça login com as mesmas credenciais para que um novo perfil seja gerado. Se funcionar, você pode escolher os arquivos do seu perfil antigo e copiá-los para o seu novo perfil.
Estranho você ter dito que enviar WM_SETTINGCHANGE
mensagem não funcionou; veresta página de suporte do Windowspara um exemplo de C#/VB que deve funcionar. Além disso, veja se basta abrir e clicar em OK na caixa de diálogo Variáveis de ambiente clicando com o botão direito no ícone Meu computador na área de trabalho, selecionando Propriedades no menu de opções, depois na guia Avançado e clicando no botão Variáveis de ambiente. Isso carrega as HKCU\Environment
variáveis para mim e vários outros postadores.
Verifique se suas HKCU\Volatile Environment
variáveis estão sendo geradas quando você faz logon. Estes devem incluir HOMEPATH
, HOMEDRIVE
, USERNAME
etc. Essa chave está completamente faltando?
Se nada funcionar, uma solução alternativa para mim foi usar SETX
um arquivo em lote colocado na pasta Inicialização de Todos os Programas de Usuários no Menu Iniciar. Para Windows XP, baixe SETX
como parte deFerramentas de suporte do Windows XP Service Pack 2.
SET HOME=
SET HOME=%USERPROFILE%
SETX HOME "%HOME%"
Isso fará com que suas HKCU\Environment
variáveis sejam lidas na inicialização. Em seguida, mescle as chaves abaixo com o seu registro. Eles serão estáticos para todos os usuários até que você corrija seu perfil, embora seja possível criar um arquivo em lote mais sofisticado, se assim desejarem. Substituirnome de usuário,servidor de logonedomínio.Este exemplo é para Windows XP.Salve-o como um arquivo .reg, clique com o botão direito e selecione mesclar. Você também pode adicioná-los usando SETX
. Você também pode usar REG ADD
ou REGEDIT
seguido, WM_SETTINGCHANGE
pois esses comandos não atualizam seu ambiente atual. VerSS64para uso de comando de SETX
, REG
e 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"=""