有时,我发现我的 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\Environment
有TEMP
=%SYSTEMROOT%\Temp
HKCU\Environment
有TEMP
=%USERPROFILE%\AppData\Local\Temp
通过使用 WinDbg 设置断点shell32!RegenerateUserEnvironment
,我能够在它发生时捕获它,但我仍然不知道为什么explorer.exe
读取错误的环境变量。
我可以通过广播WM_SETTINGCHANGE
消息来一致地重现它(我编写了一个一行 C++ 程序来执行此操作)。观察进程监视器中的活动表明 explorer.exe 甚至没有查看HKCU\Environment
。
到底是怎么回事?
答案1
我遇到了这个精确的几周前也遇到过同样的问题,这让我很抓狂。我认为导致这个问题的原因是路径变量过长。我在网上发现了其他几份关于“消失”环境变量的报告,有人认为这与路径过长有关。
我查看了一下我的安装程序,结果发现一些有缺陷的安装程序复制了所有条目(有些条目不止一次)。explorer.exe 中一定隐藏着缓冲区溢出错误。无论如何,当我删除重复项并点击确定时,我的 TEMP 变量突然重新出现在我从 explorer 启动的所有应用程序中(具有正确的值)。
答案2
您的用户配置文件可能已损坏。尝试在C:\Users
Windows 7 和C:\Documents and Settings
Windows XP 上重命名您的配置文件,然后重新启动并使用相同的凭据登录,以便生成新的配置文件。如果可行,您可以从旧配置文件中挑选文件并将其复制到新配置文件中。
奇怪的是,你说发送WM_SETTINGCHANGE
消息不起作用;看看此 Windows 支持页面一个应该可以工作的 C#/VB 示例。另外,看看是否只需在环境变量对话框中打开并单击确定,方法是右键单击桌面上的“我的电脑”图标,从选项菜单中选择“属性”,然后选择“高级”选项卡并单击“环境变量”按钮。这会HKCU\Environment
为我和其他几位发帖人加载变量。
检查HKCU\Volatile Environment
登录时是否生成了变量。这些变量应包括HOMEPATH
、HOMEDRIVE
等USERNAME
。该键是否完全缺失?
如果什么都不起作用,我的一个解决方法是使用SETX
批处理文件,该文件位于“开始”菜单中的“所有用户程序启动”文件夹中。对于 Windows XP,请SETX
下载Windows XP Service Pack 2 支持工具。
SET HOME=
SET HOME=%USERPROFILE%
SETX HOME "%HOME%"
这将触发HKCU\Environment
在启动时读取变量。然后将下面的键与注册表合并。它们对所有用户来说都是静态的,直到您修复配置文件为止,尽管如果愿意的话,可以编造一个更复杂的批处理文件。替换用户名,登录服务器和领域。此示例适用于 Windows XP。将其保存为 .reg 文件,右键单击并选择合并。您也可以使用 添加这些SETX
。您也可以使用REG ADD
或REGEDIT
后跟,WM_SETTINGCHANGE
因为这些命令不会更新您当前的环境。请参阅SS64用于SETX
、REG
和 的命令用法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"=""