
Иногда я обнаруживаю, что мои переменные среды 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
Установив точку останова shell32!RegenerateUserEnvironment
с помощью WinDbg, я могу перехватить ее, когда она происходит, но я все еще не знаю, почему explorer.exe
считываются неправильные переменные среды.
Я могу воспроизводить это последовательно, передавая WM_SETTINGCHANGE
сообщение (я написал однострочную программу на C++, чтобы сделать это). Наблюдение за активностью в Process Monitor показывает, что explorer.exe даже не смотрит на HKCU\Environment
.
Что происходит?
решение1
Я столкнулся с этимточныйТа же проблема была несколько недель назад, и она сводит меня с ума. Я думаю, что причиной является слишком длинная переменная пути. Я нашел несколько других сообщений об «исчезающих» переменных окружения в Интернете и некоторые предположения, что это связано с длинным путем.
Я посмотрел на свой, и оказалось, что некоторые глючные установщики дублировали все записи (некоторые более одного раза). Должно быть, где-то в explorer.exe зарыта ошибка переполнения буфера. В любом случае, когда я удалил дубликаты и нажал OK, моя переменная TEMP внезапно снова появилась (с правильным значением) во всех приложениях, которые я запускал из проводника.
решение2
Ваш профиль пользователя может быть поврежден. Попробуйте переименовать свой профиль в C:\Users
Windows 7 и C:\Documents and Settings
Windows XP, затем перезапустите и войдите в систему с теми же учетными данными, чтобы сгенерировать новый профиль. Если это сработает, вы можете выбрать файлы из старого профиля и скопировать их в новый профиль.
Странно, вы сказали, что отправка WM_SETTINGCHANGE
сообщения не сработала; см.эта страница поддержки Windowsдля примера C#/VB, который должен работать. Также посмотрите, можно ли просто открыть и нажать OK в диалоговом окне «Переменные среды», щелкнув правой кнопкой мыши значок «Мой компьютер» на рабочем столе, выбрать «Свойства» в меню параметров, затем вкладку «Дополнительно» и нажать кнопку «Переменные среды». Это загрузит переменные 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, щелкните правой кнопкой мыши и выберите merge. Вы также можете добавить их с помощью SETX
. Вы также можете использовать REG ADD
или REGEDIT
с последующим, WM_SETTINGCHANGE
так как эти команды не обновляют вашу текущую среду. СмотритеСС64для использования команд 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"=""