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