SetEnv — утилита для изменения environment любому процессу

Здесь можно обсудить ваш любимый плагин.
Gleb Kozyrev
Posts: 155
Joined: Thu 12 May, 2005 14:27
Location: Киев
Contact:

SetEnv — утилита для изменения environment любому процессу

Post by Gleb Kozyrev »

Тут вот недавно запостили сабж.
У него есть маленький недостаток, из-за которого я обломался, когда хотел написать такой плагин:
Не получается поменять переменные окружения процессам, запущенным как сервис.
Кстати, было бы хорошо при ошибках (не найден PID или IM или не удалось сделать, что просили) выдавать какие-то сообщения.
User avatar
John Doe
Бюрократ
Posts: 12896
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 38 times
Been thanked: 296 times

Post by John Doe »

Кстати, было бы хорошо при ошибках (не найден PID или IM или не удалось сделать, что просили) выдавать какие-то сообщения.
...И добавить ключик /V - verbose
Чтобы выводил список процессов, которым изменено окружение
А то кто его знакт, что там под маску попало...

Слегка offtopic:
5. Не работает в Windows9x. (да-да, это один из плюсов)
Думаю, что не все разделяют оптимизм Андрея :)
Прилагаю решение для пользователей Win9x (если таковые не перевелись, конечно)

WINSET: установка переменных среды Windows 95

(взято с лицензионного CD-ROM)
Attachments
envvars.rar
Microsoft WINSET - Sets values in the Windows 95 master environment
(26.75 KiB) Downloaded 785 times
User avatar
Andrey Budko
Posts: 1203
Joined: Fri 01 Apr, 2005 14:03
Contact:

Post by Andrey Budko »

John Doe wrote:...И добавить ключик /V - verbose
ага
User avatar
John Doe
Бюрократ
Posts: 12896
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 38 times
Been thanked: 296 times

Post by John Doe »

Какие параметры надо задать, чтобы изменить окружение только той консоли, из которой вызван SetEnvNT.exe?

Это вообще возможно сделать, не зная заранее PID и IM?
Если да, то почему бы не сделать так, чтобы при отсутствии в коммандной строке /PID и /IM подразумевалась бы текущая консоль?

Если нет, то почему не сделать так, чтобы подразумевался параметр /IM *?
User avatar
zg
zero-gravity
Posts: 5878
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 155 times
Contact:

Post by zg »

John Doe wrote:К…?
не слишком ли много вопросов?
User avatar
John Doe
Бюрократ
Posts: 12896
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 38 times
Been thanked: 296 times

Post by John Doe »

Один вопрос с ветвлением.
Много?
User avatar
Andrey Budko
Posts: 1203
Joined: Fri 01 Apr, 2005 14:03
Contact:

Post by Andrey Budko »

...И добавить ключик /V - verbose
Чтобы выводил список процессов, которым изменено окружение
добавил. так же добавил возможность смотреть перменные окружения: SETENV aaa /IM ... /PID ...
Какие параметры надо задать, чтобы изменить окружение только той консоли, из которой вызван SetEnvNT.exe?
ну если, например, для фара - пиши SETENV aaa bbb /IM far.exe - не промахнешься
почему бы не сделать так, чтобы при отсутствии в коммандной строке /PID и /IM подразумевалась бы текущая консоль?
не знаю "как"
Если нет, то почему не сделать так, чтобы подразумевался параметр /IM *?
слишком жестко. после такого, что не запустишь - там уже будет твоя переменная

выложу позже
User avatar
Andrey Budko
Posts: 1203
Joined: Fri 01 Apr, 2005 14:03
Contact:

Post by Andrey Budko »

John Doe wrote:Один вопрос с ветвлением.
Много?
через чур разветвленный получился вопрос с ветвлением )
User avatar
zg
zero-gravity
Posts: 5878
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 155 times
Contact:

Post by zg »

Andrey Budko wrote:
почему бы не сделать так, чтобы при отсутствии в коммандной строке /PID и /IM подразумевалась бы текущая консоль?
не знаю "как"
PROCESS_BASIC_INFORMATION.InheritedFromUniqueProcessId.
User avatar
Andrey Budko
Posts: 1203
Joined: Fri 01 Apr, 2005 14:03
Contact:

Post by Andrey Budko »

zg wrote:PROCESS_BASIC_INFORMATION.InheritedFromUniqueProcessId.
не то. в частности при запуске из фара ParentProcessID будет указывать на %comspec%, а в какой-нибудь более ранней версии может и на сам фар. а надо тот процесс в который идет стдаутпут, а идти он может куда угодно.
на худой конец можно завести опцию /PARENT <level>
User avatar
zg
zero-gravity
Posts: 5878
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 155 times
Contact:

Post by zg »

Andrey Budko wrote:на худой конец можно завести опцию /PARENT <level>
или /PARENT /IM far.exe
User avatar
John Doe
Бюрократ
Posts: 12896
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 38 times
Been thanked: 296 times

Post by John Doe »

Andrey Budko wrote: не то. в частности при запуске из фара ParentProcessID будет указывать на %comspec%, а в какой-нибудь более ранней версии может и на сам фар. а надо тот процесс в который идет стдаутпут, а идти он может куда угодно.
на худой конец можно завести опцию /PARENT <level>
А если проще?

Code: Select all

Пока (ParentProcess==%COMSPEC%) делать level++
User avatar
Andrey Budko
Posts: 1203
Joined: Fri 01 Apr, 2005 14:03
Contact:

Post by Andrey Budko »

или /PARENT /IM far.exe
Не сильно поможет, так как фары обычно запускают один из одного. Без необязательного параметра maxlevel не обойтись.
А если проще?
Это может и проще, но не правильно и не универсально. Я сделал так:
SETENV name=value [/PARENTS [maxlevel]] [/IM imagename ...] [/PID processid ...] [/V]
То есть чтобы установить переменную только фару, разумеется если SETENV запускается из него, надо выполнить:
SETENV aaa=bbb /PARENTS 2 /IM far.exe
User avatar
Andrey Budko
Posts: 1203
Joined: Fri 01 Apr, 2005 14:03
Contact:

Post by Andrey Budko »

Выложил новую версию:
http://forum.farmanager.com/viewtopic.php?t=260

Теперь работает так:

Code: Select all

SETENV variable[=string] [/PID processid ...] [/IM imagename ...]
                         [/P [depth]] [/V] [/U] [/W]

Description:
  Displays, sets, or removes environment variables for any processes

Parameters list:
  variable   Specifies the environment-variable name.
  string     Specifies a series of characters to assign to the variable.
  processid  Specifies the process ID of the process.
  imagename  Specifies the image name of the process.
  /P depth   Specifies processing only chains of parental processes
             with optional limitation of depth.
  /V         Specifies that verbose information be displayed in the output.
  /U         Specifies that output to a pipe or file to be Unicode.
  /W         Specifies to wait for pressing any key after execution.

NOTE:
  Wildcards '*', '?' can be used to specify imagename and processid.
dolzenko
Posts: 452
Joined: Wed 19 Apr, 2006 14:42
Location: Ростов-на-Дону

Re: SetEnv - утилита для изменения environment любому процессу

Post by dolzenko »

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

Code: Select all

--- C:/Program Files/setenv/src/env.cpp	Wed Oct 15 14:22:56 2008
+++ C:/Program Files/setenv/src/env_patched.cpp	Wed Oct 15 14:29:41 2008
@@ -36,3 +36,3 @@
     case ENV_GET:
-      TCHAR buf[256];
+      TCHAR buf[2048];
       res = _GetEnvironmentVariable(info.Name, buf, sizeof(buf) / sizeof(TCHAR));
Post Reply

Return to “Обсуждение плагинов”