Page 1 of 2

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

Posted: Sat 28 May, 2005 14:10
by Gleb Kozyrev
Тут вот недавно запостили сабж.
У него есть маленький недостаток, из-за которого я обломался, когда хотел написать такой плагин:
Не получается поменять переменные окружения процессам, запущенным как сервис.
Кстати, было бы хорошо при ошибках (не найден PID или IM или не удалось сделать, что просили) выдавать какие-то сообщения.

Posted: Sat 28 May, 2005 21:23
by John Doe
Кстати, было бы хорошо при ошибках (не найден PID или IM или не удалось сделать, что просили) выдавать какие-то сообщения.
...И добавить ключик /V - verbose
Чтобы выводил список процессов, которым изменено окружение
А то кто его знакт, что там под маску попало...

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

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

(взято с лицензионного CD-ROM)

Posted: Sat 28 May, 2005 22:25
by Andrey Budko
John Doe wrote:...И добавить ключик /V - verbose
ага

Posted: Sun 29 May, 2005 19:51
by John Doe
Какие параметры надо задать, чтобы изменить окружение только той консоли, из которой вызван SetEnvNT.exe?

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

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

Posted: Sun 29 May, 2005 20:09
by zg
John Doe wrote:К…?
не слишком ли много вопросов?

Posted: Mon 30 May, 2005 20:28
by John Doe
Один вопрос с ветвлением.
Много?

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

выложу позже

Posted: Mon 30 May, 2005 21:01
by Andrey Budko
John Doe wrote:Один вопрос с ветвлением.
Много?
через чур разветвленный получился вопрос с ветвлением )

Posted: Tue 31 May, 2005 09:39
by zg
Andrey Budko wrote:
почему бы не сделать так, чтобы при отсутствии в коммандной строке /PID и /IM подразумевалась бы текущая консоль?
не знаю "как"
PROCESS_BASIC_INFORMATION.InheritedFromUniqueProcessId.

Posted: Tue 31 May, 2005 10:58
by Andrey Budko
zg wrote:PROCESS_BASIC_INFORMATION.InheritedFromUniqueProcessId.
не то. в частности при запуске из фара ParentProcessID будет указывать на %comspec%, а в какой-нибудь более ранней версии может и на сам фар. а надо тот процесс в который идет стдаутпут, а идти он может куда угодно.
на худой конец можно завести опцию /PARENT <level>

Posted: Tue 31 May, 2005 11:09
by zg
Andrey Budko wrote:на худой конец можно завести опцию /PARENT <level>
или /PARENT /IM far.exe

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

Code: Select all

Пока (ParentProcess==%COMSPEC%) делать level++

Posted: Wed 01 Jun, 2005 21:22
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

Posted: Sun 05 Jun, 2005 17:46
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.

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

Posted: Wed 15 Oct, 2008 10:33
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));