Что нового

Не удается получить эффект от изменения переменной PATH

gora

Знающий
Сообщения
315
Репутация
19
Рядом со скриптом лежит папка bin в которой есть файлы консольного архиватора: 7z.exe и 7z.dll версии 9.30.
В папках c:\Windows\System32 и c:\Windows\SysWOW64 лежат аналогичные пары файлов, но версии 4.65

OC Win7SP1 x64

Задача: используя переменную PATH, (не используя полные пути к архиватору) вызвать архиватор именно из папки bin

Тестовый скрипт:
Код:
$7z = '7z.exe'

; Вариант 1
	EnvSet('PATH', @ScriptDir & '\bin;' & EnvGet('PATH'))
; Вариант 2
;	EnvSet('PATH', EnvGet('PATH') & ';' & @ScriptDir & '\bin')
; Вариант 3
;	EnvSet('PATH', @ScriptDir & '\bin')
EnvUpdate()

MsgBox(4096, 'Значение %Path%', EnvGet('PATH'))
RunWait($7z & ' b')
Exit

Ни один из вариантов не срабатывает! Переменная PATH меняется, но всегда запускается версия 4.65. :(
1 Почему так происходит?
2 Как решить задачу?
3 Какой эффект должен быть от EnvUpdate()? Я его не обнаруживаю.

Спасибо.
 

Microteam

Осваивающий
Сообщения
74
Репутация
34
Код:
Func _AddToPathEnv($path)
   $p = RegRead("HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment", "PATH")
   
   $p &= ';'&$path
   RegWrite("HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment", "PATH", "REG_EXPAND_SZ", $p)
EndFunc

_AddToPathEnv(@ScriptDir & '\bin')



А если так???
 
Автор
G

gora

Знающий
Сообщения
315
Репутация
19
Maalik [?]
1 Это потребует перезагрузки, а нужно менять налету и только на время работы скрипта.
2 Проверял я добавление пути в реестр и перезагружался, но эффекта 0. Все равно запускает 4.65. Такое впечатление, что ни какие изменения PATH не свернут систему с, известного только ей, пути... :(
 

Microteam

Осваивающий
Сообщения
74
Репутация
34
А если использовать через DOS? Ну примерно так:
Код:
#include<Process.au3>

_RunDos('SET PATH = "вашпуть" && START WAIT program.exe')
 

asdf8

Скриптер
Сообщения
564
Репутация
152
gora [?]
Ни один из вариантов не срабатывает! Переменная PATH меняется, но всегда запускается версия 4.65.
sad.gif

1 Почему так происходит?

Переменная PATH используется виндой, чтобы запускаемая программа могла использовать dll, которые ей нужны, без указания полного пути. Чтобы сама программа использовала PATH - в коде программы нужно писать свой обработчик. Вряд-ли кодерам интересно заниматься такой, в большинстве случаев, бесполезной работой.


2 Как решить задачу?

Код:
FileChangeDir(@ScriptDir & '\bin')
RunWait('7z.exe b')
 
Автор
G

gora

Знающий
Сообщения
315
Репутация
19
asdf8 [?]
Переменная PATH используется виндой, чтобы запускаемая программа могла использовать dll, которые ей нужны, без указания полного пути. Чтобы сама программа использовала PATH - в коде программы нужно писать свой обработчик.
Непонятно, растолкуйте, пожалуйста. 7z не может использоваться, если он находиться в одной из папок перечисленных в PATH ?
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
А по-моему синтаксически правильно должно быть так

Код:
; Вариант 1
    EnvSet('PATH', @ScriptDir & '\bin\;' & EnvGet('PATH'))
 

asdf8

Скриптер
Сообщения
564
Репутация
152
gora [?]
Непонятно, растолкуйте, пожалуйста. 7z не может использоваться, если он находиться в одной из папок перечисленных в PATH ?

Проверить не сложно :
Код:
EnvSet('PATH', @ScriptDir & '\bin;' & EnvGet('PATH'))
ConsoleWrite(FileExists('7z.exe') & @CRLF)
 
Автор
G

gora

Знающий
Сообщения
315
Репутация
19
asdf8 [?]
Проверить не сложно :
Понятнее не стало. Ну нет файла по указанному, точнее неуказанному, в команде пути и что? Архиватор то запускается. Замените в Вашем примере 7z на cmd и тоже получите отсутствие файла. Тем не менее cmd.exe есть в путях переменной PATH и прекрасно работает.
Попробуйте ответить на вопрос:
gora [?]
7z не может использоваться, если он находиться в одной из папок перечисленных в PATH ?
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
Варианты
Код:
Run(@ComSpec & " /c Path " & @ScriptDir & "\bin;%Path% && 7z.exe b")
ShellExecute(@ComSpec, "/c Path " & @ScriptDir & "\bin;%Path% && 7z.exe b")
 
Автор
G

gora

Знающий
Сообщения
315
Репутация
19
InnI
Ваш вариант работает, но это cmd, а мне нужен AutoIt. В батнике это работает, а почему в AutoIt изменение переменной остается без эффекта для запуска архиватора!?
 

asdf8

Скриптер
Сообщения
564
Репутация
152
gora [?]
Попробуйте ответить на вопрос:gora [?]Цитата
7z не может использоваться, если он находиться в одной из папок перечисленных в PATH ?

Если эта папка не является рабочей папкой текущего процесса - то нет.


Тем не менее cmd.exe есть в путях переменной PATH и прекрасно работает.

Я б не стал связывать запуск cmd.exe с переменной PATH:

Код:
EnvSet('PATH', '')
ConsoleWrite(EnvGet('PATH') & @CRLF)
$pid = Run('cmd.exe')
ConsoleWrite($pid & @CRLF)
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
asdf8 [?]
Я б не стал связывать запуск cmd.exe с переменной PATH
Похоже, именно в этом и проблема. Какую бы переменную окружения AutoIt не установил, сам он читает из системной %path%. Даже пользовательскую игнорирует. А функция EnvUpdate() либо не работает, либо я чего-то не понимаю :scratch:
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
Небольшая проверка показала следующее.
После добавления пути к собственному каталогу получилась следующая переменная окружения:
C:\Users\***\Downloads\bin;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;...
Раскидал файлы, начал запускать:
Код:
C:\Windows\system32
C:\Windows
C:\Users\***\Downloads\bin          <= добавленный мною путь
C:\Windows\System32\Wbem...
Похоже, у AutoIt системные папки всегда идут первыми, в отличие от cmd.exe, который ищет пути по порядку перечисления в %path%. Видимо здесь и проблема.
 
Автор
G

gora

Знающий
Сообщения
315
Репутация
19
InnI [?]
Похоже, у AutoIt системные папки всегда идут первыми, в отличие от cmd.exe, который ищет пути по порядку перечисления в %path%. Видимо здесь и проблема.
Проблема, мне кажется, даже глубже. Я удалил из PATH путь C:\Windows\system32 и перезагрузился. После перезагрузки из ком строки невозможно запустить cmd.exe и это логично. Но AutoIt все не почем. И cmd.exe запускает и архиватор 4.65 видит и запускает из C:\Windows\system32...
Создается впечатление, что пути к системным папкам AutoIt считывает не из реестра (HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment), а имеет другой источник данных или эти папки намерво прописаны в нем в некоем виде.
Вся его возня с изменением переменной PATH сводится к игнорированию любых действий пользователя по удалению из этой переменной системных папок и добалению пользовательских в конец списка. При этом он демонстрирует пользователю свою полную покорность по модификации переменной, мол все сделано как просили, а сам втихаря пользуется совсем иной переменной (набором путей)
 

AZJIO

Меценат
Меценат
Сообщения
2,879
Репутация
1,194
Может _WinAPI_PathFindOnPath поможет получить путь, там можно заказать поиск сначала в пользовательских папках.
 
Верх