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

Rog*_*mbe 6 windows-7 environment-variables

有时,我发现我的 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
Run Code Online (Sandbox Code Playgroud)

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

Value cannot be null.
Parameter name: viewInfo (Microsoft.SqlServer.Management.SqlStudio.Explorer)
Run Code Online (Sandbox Code Playgroud)

如果我运行 PowerShell 提升,则$env:TEMP设置正确。如果我运行 PowerShell 非提升,那么它不是。我相信在这两种情况下都应该正确设置。如果没有,那就是错误的方式。

CMD.EXE 也是如此。

重新启动会暂时修复它,直到某些东西再次破坏它。据推测,加载到 Explorer.exe 中的某些东西会干扰其环境变量,但是什么?

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

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

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

我可以通过广播WM_SETTINGCHANGE消息来一致地重现它(我写了一个单行 C++ 程序来做到这一点)。观察进程监视器中的活动表明 explorer.exe 甚至不看HKCU\Environment.

到底是怎么回事?

Mar*_*ski 0

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

奇怪的是你说发消息WM_SETTINGCHANGE不起作用;请参阅此 Windows 支持页面以获取应该有效的 C#/VB 示例。另外,通过右键单击桌面上的“我的电脑”图标,从选项菜单中选择“属性”,然后选择“高级”选项卡并单击“环境变量”按钮,查看是否只是打开“环境变量”对话框并单击“确定”。这会HKCU\Environment为我和其他几位海报加载变量。

检查HKCU\Volatile Environment登录时是否正在生成变量。这些应该包括HOMEPATH、等HOMEDRIVEUSERNAME该密钥是否完全丢失?

如果没有任何效果,我的解决方法是使用SETX放置在“开始”菜单中“所有用户程序启动”文件夹中的批处理文件。对于 Windows XP,请SETX作为Windows XP Service Pack 2 支持工具的一部分进行下载。

SET HOME=
SET HOME=%USERPROFILE%
SETX HOME "%HOME%"
Run Code Online (Sandbox Code Playgroud)

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