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

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

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

Postby Gleb Kozyrev » Sat 28 May, 2005 14:10

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

User avatar
John Doe
Бюрократ
Posts: 11042
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 9 times
Been thanked: 62 times

Postby John Doe » Sat 28 May, 2005 21:23

Кстати, было бы хорошо при ошибках (не найден 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 734 times

User avatar
Andrey Budko
Posts: 1204
Joined: Fri 01 Apr, 2005 14:03
Contact:

Postby Andrey Budko » Sat 28 May, 2005 22:25

John Doe wrote:...И добавить ключик /V - verbose

ага

User avatar
John Doe
Бюрократ
Posts: 11042
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 9 times
Been thanked: 62 times

Postby John Doe » Sun 29 May, 2005 19:51

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

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

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

User avatar
zg
zero-gravity
Posts: 5206
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 40 times
Contact:

Postby zg » Sun 29 May, 2005 20:09

John Doe wrote:К…?
не слишком ли много вопросов?

User avatar
John Doe
Бюрократ
Posts: 11042
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 9 times
Been thanked: 62 times

Postby John Doe » Mon 30 May, 2005 20:28

Один вопрос с ветвлением.
Много?

User avatar
Andrey Budko
Posts: 1204
Joined: Fri 01 Apr, 2005 14:03
Contact:

Postby Andrey Budko » Mon 30 May, 2005 20:56

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

слишком жестко. после такого, что не запустишь - там уже будет твоя переменная

выложу позже

User avatar
Andrey Budko
Posts: 1204
Joined: Fri 01 Apr, 2005 14:03
Contact:

Postby Andrey Budko » Mon 30 May, 2005 21:01

John Doe wrote:Один вопрос с ветвлением.
Много?

через чур разветвленный получился вопрос с ветвлением )

User avatar
zg
zero-gravity
Posts: 5206
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 40 times
Contact:

Postby zg » Tue 31 May, 2005 09:39

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

User avatar
Andrey Budko
Posts: 1204
Joined: Fri 01 Apr, 2005 14:03
Contact:

Postby Andrey Budko » Tue 31 May, 2005 10:58

zg wrote:PROCESS_BASIC_INFORMATION.InheritedFromUniqueProcessId.

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

User avatar
zg
zero-gravity
Posts: 5206
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 40 times
Contact:

Postby zg » Tue 31 May, 2005 11:09

Andrey Budko wrote:на худой конец можно завести опцию /PARENT <level>
или /PARENT /IM far.exe

User avatar
John Doe
Бюрократ
Posts: 11042
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 9 times
Been thanked: 62 times

Postby John Doe » Wed 01 Jun, 2005 20:57

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


А если проще?

Code: Select all

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

User avatar
Andrey Budko
Posts: 1204
Joined: Fri 01 Apr, 2005 14:03
Contact:

Postby Andrey Budko » Wed 01 Jun, 2005 21:22

или /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: 1204
Joined: Fri 01 Apr, 2005 14:03
Contact:

Postby Andrey Budko » Sun 05 Jun, 2005 17:46

Выложил новую версию:
SETENV — утилита для изменения environment любому процессу

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

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 любому процессу

Postby dolzenko » Wed 15 Oct, 2008 10:33

Здесь косвенно заявляется, что размер переменных окружения может быть до 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));

User avatar
DrKnS
Posts: 4458
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 2 times
Been thanked: 105 times
Contact:

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

Postby DrKnS » Wed 15 Oct, 2008 10:44

dolzenko_ wrote:Здесь косвенно заявляется, что размер переменных окружения может быть до 2048 байт

А здесь явно заявляется, что можно аж 32767.


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

Who is online

Users browsing this forum: No registered users and 12 guests