PDA

Показать полную графическую версию : [решено] странный возврат макроса @TempDir


saavaage
20-10-2010, 09:51
суть проблемы:
1. вношу твиками новые значение для путей к папкам временных файлов (Temp) и переменных сред (Tmp):
а)Temp (например, путь D:\1)
Код:
$Input_MyTemp = 'D:\1'
RunWait(@COMSPEC & ' /c Echo Y | Cacls ' & $Input_MyTemp&' /E /P "Все":F', '', @SW_HIDE)
RegWrite('HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment', 'TEMP', 'REG_SZ', $Input_MyTemp)
;~ RegWrite('HKEY_LOCAL_MACHINE\SYSTEM\ControlSet\Control\Session Manager\Environment', 'TEMP', 'REG_SZ', $Input_MyTemp)
RegWrite('HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Session Manager\Environment', 'TEMP', 'REG_SZ', $Input_MyTemp)
RegWrite('HKEY_LOCAL_MACHINE\SYSTEM\ControlSet002\Control\Session Manager\Environment', 'TEMP', 'REG_SZ', $Input_MyTemp)
RegWrite('HKEY_CURRENT_USER\Environment', 'TEMP', 'REG_SZ', $Input_MyTemp)

б) Tmp (например, D:\Tweaks):
Код:
$Input_MyTmp ='D:\Tweaks'
RegWrite('HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment', 'TMP', 'REG_SZ', $Input_MyTmp)
;~ RegWrite('HKEY_LOCAL_MACHINE\SYSTEM\ControlSet\Control\Session Manager\Environment', 'TMP', 'REG_SZ', $Input_MyTmp)
RegWrite('HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Session Manager\Environment', 'TMP', 'REG_SZ', $Input_MyTmp)
RegWrite('HKEY_LOCAL_MACHINE\SYSTEM\ControlSet002\Control\Session Manager\Environment', 'TMP', 'REG_SZ', $Input_MyTmp)
RegWrite('HKEY_CURRENT_USER\Environment', 'TMP', 'REG_SZ', $Input_MyTmp)

2. Логично ожидать получение следующего результата -пути для:
а) Temp - D:\1
б) Tmp - D:\Tweaks

3. В итоге получаем:
Реестр - все согласно твиков
Панель управления -> Система -> Дополнительно -> Переменные среды - все согласно твиков
Вызов Msgbox (0, '', @TempDir) упорно возвращает D:\Tweaks...

Не понимаю, что я сделал не так???

PS Папки Temp и Tmp уже созданы.

Iska
20-10-2010, 12:13
saavaage, как и здесь: #4 (http://forum.oszone.net/post-1520501-4.html), текущий процесс уже имеет установленную среду. Это раз. Второе — данные параметры считываются из реестра при старте ОС/входе пользователя в систему соответственно, так что, банально сделать запись в реестр недостаточно. В некоторые Resource Kit'ы входит утилита «setx.exe», одно из применений которой — задание переменных окружения (опять же, только для вновь создаваемых процессов) с сохранением в профиле [читай, реестре] системы/текущего пользователя. Как выполнить уведомление о произведённых изменениях в реестре смотрите в самом конце статьи Environment Variables (Windows) (http://msdn.microsoft.com/en-us/library/ms682653(VS.85).aspx):

Calling SetEnvironmentVariable has no effect on the system environment variables. To programmatically add or modify system environment variables, add them to the HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment registry key, then broadcast a WM_SETTINGCHANGE message with lParam set to the string "Environment". This allows applications, such as the shell, to pick up your updates.

saavaage
20-10-2010, 15:18
Cпасибо большое, пошел курить маны... :)

И все-таки, непонятно, почему макрос отображает не просто старое значение, а неверное значение (я менял и Temp и Tmp и он отображает, именно, новый путь к Tmp, вместо старого пути к Temp ("С:\Temp"))...

saavaage
20-10-2010, 18:30
итак, на настоящий момент выяснил следующее:

1. макрос @TempDir должен отображать путь к папке временных файлов, считанный системой при ее загрузке. Т.е. при изменении в входе сессии пользователем, все равно, отображаются старые значения.

2. при разных путях к Temp и Tmp макрос @TempDir отображает путь к Tmp, игнорируя Temp. Даже после перезагрузки он стандартно отображает путь к Tmp, а не к моей папке временных файлов Temp.

3. Складывается ощущение, что макрос изначально выдает информацию именно по Tmp, а не Temp. Проверить быстро не могу, т.к. у меня изначально винда ставится с одинаковым путем и для Temp и Tmp...

PS Во избежания эффекта "кривых ручек" для задания новых значений Temp и Tmp применял вполне официальную утилиту setenv.exe. Эффект - аналогично эффекту вноса через твики (в шапке).

Если возможно, уважаемые гуру, отпишитесь баг ли это и если нет, то в чем я не прав...

FlatX007
20-10-2010, 21:24
Путь то есть а папки нет - надо создать папку ...

saavaage
20-10-2010, 23:55
FlatX007, ну я не такой дремучий... Папка уже создана, просто в примере я этого не указывал, думал, что это очевидно... Шапку поправил.

FlatX007
21-10-2010, 00:14
тут все папки ...

HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders

saavaage
21-10-2010, 00:21
FlatX007,
считать информацию можно (так или иначе), вопрос в том, что у меня в скрипте (утилита SmartXP) много завязано на создании файлов и их подхвате через переменную @TempDir и меня эта ситуация (с некорректным возвратом), очень сильно напрягает. Да и на будущее, этот вопрос необходимо "дожать".

Iska
21-10-2010, 05:21
тут все папки ...
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders
:): Длинная и печальная история ключа Shell Folders (http://www.transl-gunsmoker.ru/2008/12/shell-folders.html). Я сам этим ранее пользовался (http://forum.script-coding.info/viewtopic.php?id=5033).
2. при разных путях к Temp и Tmp макрос @TempDir отображает путь к Tmp, »
У меня — путь из пользовательской «%tmp%». Версия AutoIt 3.3.4.0. Ну и что? По всем рекомендациям и унаследованная переменная окружения TMP, и более новая TEMP обязаны указывать в одно и то же местоположение: папку временных файлов. Сам AutoIt пользует TMP. Про GetTempPath (http://msdn.microsoft.com/en-us/library/aa364992%28VS.85%29.aspx), для личных нужд, Вам уже сказали (http://autoit-script.ru/index.php?PHPSESSID=r947ki48ttpk4qhv2bcjrmi573&topic=2916.msg21160#msg21160). А зачем Вам «setenv»? Вы пробовали после записи в реестр разослать широковещательное сообщение с WM_SETTINGCHANGE (http://forum.oszone.net/post-1522986-2.html)?

saavaage
21-10-2010, 06:24
Iska, для чего тогда в панели управления и реестре предусмотрена возможность задания разных путей для Tmp и Temp?
А зачем Вам «setenv»? »
только для одного - хочу, чтобы настройки вступали в строй не после перезагрузки системы, а сразу.

PS у меня и Tmp и Temp имеют одно и тоже месторасположение, но как с этим у других юзеров я могу только догадываться...

Iska
21-10-2010, 09:24
Iska, для чего тогда в панели управления и реестре предусмотрена возможность задания разных путей для Tmp и Temp?
Не только для «Tmp» и «Temp», но и для любой другой переменной окружения. Причём, не только путей, но и любой произвольной строки. Никто ведь не заставляет задавать разные пути, как раз наоборот. Это ведь всего лишь вопрос соглашения — что в TEMP и TMP будет храниться путь ко временным файлам, а, скажем, в COMSPEC — путь к интерпретатору команд.

saavaage
21-10-2010, 16:02
Тема более детально была обсуждена на русском форуме.
Ссылка http://autoit-script.ru/index.php/topic,2916.0.html
Чтобы не плодить топики, закрываю как решенную

Спасибо, Iska, за помощь!




© OSzone.net 2001-2012