TEMP 环境变量偶尔设置不正确

TEMP 环境变量偶尔设置不正确

有时,我发现我的 TEMP 和 TMP 环境变量设置为C:\Windows\TEMP。它们应该设置为%USERPROFILE%\AppData\Local\Temp,并且在系统属性

这表现为如下错误消息:

---> 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

...这种情况发生在各种 .NET 应用程序中(特别是 Visual Studio 2010 或 SQL Server Management Studio)。或者,SQL Server Management Studio 将报告:

Value cannot be null.
Parameter name: viewInfo (Microsoft.SqlServer.Management.SqlStudio.Explorer)

如果我以提升权限运行 PowerShell,则$env:TEMP设置正确。如果我以非提升权限运行 PowerShell,则设置不正确。我认为在两种情况下都应该正确设置。如果没有,则设置错误。

CMD.EXE 也是如此。

重启可以暂时解决这个问题,直到某物又把它搞坏了。大概是加载到 Explorer.exe 中的某些东西干扰了它的环境变量,但是什么呢?

即使发生这种情况,注册表中的值也是正确的:

  • HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\EnvironmentTEMP=%SYSTEMROOT%\Temp
  • HKCU\EnvironmentTEMP=%USERPROFILE%\AppData\Local\Temp

通过使用 WinDbg 设置断点shell32!RegenerateUserEnvironment,我能够在它发生时捕获它,但我仍然不知道为什么explorer.exe读取错误的环境变量。

我可以通过广播WM_SETTINGCHANGE消息来一致地重现它(我编写了一个一行 C++ 程序来执行此操作)。观察进程监视器中的活动表明 explorer.exe 甚至没有查看HKCU\Environment

到底是怎么回事?

答案1

我遇到了这个精确的几周前也遇到过同样的问题,这让我很抓狂。我认为导致这个问题的原因是路径变量过长。我在网上发现了其他几份关于“消失”环境变量的报告,有人认为这与路径过长有关。

我查看了一下我的安装程序,结果发现一些有缺陷的安装程序复制了所有条目(有些条目不止一次)。explorer.exe 中一定隐藏着缓冲区溢出错误。无论如何,当我删除重复项并点击确定时,我的 TEMP 变量突然重新出现在我从 explorer 启动的所有应用程序中(具有正确的值)。

答案2

您的用户配置文件可能已损坏。尝试在C:\UsersWindows 7 和C:\Documents and SettingsWindows XP 上重命名您的配置文件,然后重新启动并使用相同的凭据登录,以便生成新的配置文件。如果可行,您可以从旧配置文件中挑选文件并将其复制到新配置文件中。

奇怪的是,你说发送WM_SETTINGCHANGE消息不起作用;看看此 Windows 支持页面一个应该可以工作的 C#/VB 示例。另外,看看是否只需在环境变量对话框中打开并单击确定,方法是右键单击桌面上的“我的电脑”图标,从选项菜单中选择“属性”,然后选择“高级”选项卡并单击“环境变量”按钮。这会HKCU\Environment为我和其他几位发帖人加载变量。

检查HKCU\Volatile Environment登录时是否生成了变量。这些变量应包括HOMEPATHHOMEDRIVEUSERNAME。该键是否完全缺失?

如果什么都不起作用,我的一个解决方法是使用SETX批处理文件,该文件位于“开始”菜单中的“所有用户程序启动”文件夹中。对于 Windows XP,请SETX下载Windows XP Service Pack 2 支持工具

SET HOME=
SET HOME=%USERPROFILE%
SETX HOME "%HOME%"

这将触发HKCU\Environment在启动时读取变量。然后将下面的键与注册表合并。它们对所有用户来说都是静态的,直到您修复配置文件为止,尽管如果愿意的话,可以编造一个更复杂的批处理文件。替换用户名登录服务器领域此示例适用于 Windows XP。将其保存为 .reg 文件,右键单击并选择合并。您也可以使用 添加这些SETX。您也可以使用REG ADDREGEDIT后跟,WM_SETTINGCHANGE因为这些命令不会更新您当前的环境。请参阅SS64用于SETXREG和 的命令用法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"=""

相关内容