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 變數突然重新出現在我從資源管理器啟動的所有應用程式中(具有正確的值)。

答案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"=""

相關內容