установить переменную в cmd.exe

Приветствую землян,

Вот мой вопрос:

Как я могу создать программу, которая устанавливает переменную для текущего сеанса cmd.exe, например.

c:\> set myvar
Environment variable myvar not defined
c:\>myexe.exe
c:>set myvar
myvar=myvalue

Единственная похожая тема, которую я нашел, это -

Как изменить оболочку Windows (cmd.exe) переменные окружения из C++?

Но я не понял ни слова из этого:

Есть способ... Просто введите свой код в родительский процесс и вызовите SetEnvironmentVariableA внутри памяти процесса cmd. После инъекции просто освободите выделенную память.

Хотя C/C++ не является моим «родным» языком, я чувствовал себя совершенно потерянным, когда искал в Google «код для ввода C++» и т. д. Есть ли статья, где я могу получить больше информации об этом.

Кстати, теперь я использую один немного глупый обходной путь. Как установить переменную в

HKEY_CURRENT_USER\Окружающая среда

и

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment

сравнительно легко, я просто записываю аналогичную переменную в реестр:

load.temp.vars=set myvar1=myval1&set myvar2=myval2& ....

а затем просто вызовите %load.temp.vars% и он будет выполнен как команда:

c:/>%load.temp.vars%
c:/>set myvar1
myvar1=myval1

Работает нормально, но мне этого мало :)

Живи долго и процветай, \\//_


person npocmaka    schedule 10.07.2010    source источник
comment
возможный дубликат Возможно ли изменить среду родительского процесса в python?   -  person Hans Passant    schedule 10.07.2010


Ответы (2)


arrow_upward
2
arrow_downward

Прочтите эту статью: Три способа внедрить свой код в другой процесс .

Также вам, вероятно, понадобится дескриптор вашего родительского процесса (чтобы определить целевой процесс, среду которого нужно изменить). Способ его получения описан здесь.

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

person atzz    schedule 10.07.2010

arrow_upward
2
arrow_downward

Есть очень простой способ сделать это без всяких хитростей.

Вы должны написать небольшую программу myexe.exe, которая выводит простой вывод (консольный вывод), как показано ниже:

SET myvar=Some value

затем вы начинаете свою программу со следующих шагов:

myexe.exe >%TEMP%\t.cmd
call %TEMP%\t.cmd
del %TEMP%\t.cmd

Теперь в текущем cmd.exe, который запустил myexe.exe, существует переменная окружения myvar и она имеет значение Some value. Это не совсем то, что вы хотите?

Способ предельно прост и работает на всех версиях Windows (и не только на Windows). Так что это моя рекомендация для вас.

person Oleg    schedule 10.07.2010
comment
ваш пример в том виде, в котором он опубликован, будет работать только в Windows. Однако этот метод универсален (если предположить, что у всех есть какой-нибудь интерпретатор оболочки, такой как Bash). - person rubenvb; 10.07.2010
comment
Я имею в виду метод (или способ) - person Oleg; 10.07.2010
comment
@Johannes: У каждого человека может быть свое мнение. Если вы предпочитаете производить вывод только со значением, чем вам нужно писать больше кода в пакетном режиме, что ОЧЕНЬ медленно, сделайте это. Более того, в реальной ситуации нужно задать не одну, а набор переменных окружения. В этом случае вывод нескольких строк SET myvar=Some value - лучшее решение, которое я знаю. У меня был первый опыт решения такой задачи в MS DOS с использованием недокументированных, но хорошо известных возможностей. Позже я пробовал разные способы и нашел этот способ, который считаю лучшим. Если вы предпочитаете другой способ, пожалуйста, используйте его. - person Oleg; 10.07.2010