6

Иногда мои переменные окружения 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 .

Что здесь происходит?

2 ответа2

1

Я столкнулся с этим точно такой же проблемой несколько недель назад , и это было мне вождение тронутого. Я думаю, что является причиной слишком длинной переменной пути. Я нашел несколько других сообщений об "исчезающих" переменных окружения в сети и некоторые предположения, что это связано с длинным путем.

Я посмотрел на мой, и оказалось, что некоторые установщики с ошибками дублировали все записи (некоторые более одного раза). Там должна быть ошибка переполнения буфера, похороненная где-то в explorer.exe. В любом случае, когда я удалил дубликаты и нажал OK, моя переменная TEMP внезапно вновь появилась (с правильным значением) во всех приложениях, которые я запустил из проводника.

0

Ваш профиль пользователя может быть поврежден. Попробуйте переименовать свой профиль в 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 с пакетом обновления 2 (SP2).

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .