Как я могу изменить переменные среды оболочки Windows (cmd.exe) из C ++? - PullRequest
1 голос
/ 21 апреля 2009

Я хотел бы написать программу, которая устанавливает переменную среды в экземпляре оболочки (cmd.exe), из которой она была вызвана. Идея состоит в том, чтобы я мог сохранить некоторое состояние в этой переменной и затем использовать его снова при последующем вызове.

Я знаю, что есть такие команды, как SetEnvironmentVariable, но я понимаю, что они меняют только переменную для текущего процесса и не изменяют переменные вызывающей оболочки.

В частности, я хотел бы создать команду, которая может перебрасываться между двумя каталогами. Pushd / Popd может перейти в каталог и обратно, но у него нет способа вернуть второй раз в первоначально отправленный каталог.

Ответы [ 4 ]

6 голосов
/ 21 апреля 2009

MSDN сообщает следующее :

Звонить SetEnvironmentVariable не имеет влияние на системную среду переменные. Чтобы программно добавить или изменить системные переменные среды, добавить их в HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment ключ реестра, затем передать сообщение WM_SETTINGCHANGE с lParam установленным в строку "Среда". Это позволяет приложения, такие как оболочка, для забрать свои обновления. Обратите внимание, что значения переменных среды перечисленные в этом ключе ограничены 1024 символы.

Учитывая, что существует два уровня среды - Система и Процесс, - изменение их в оболочке будет означать изменение среды другого процесса. Я не верю, что это возможно.

3 голосов
/ 21 апреля 2009

Распространенной техникой является запись файла env, который затем вызывается из скрипта.

del env.var
foo.exe ## writes to env.var
call env.var
3 голосов
/ 21 апреля 2009

В Windows, когда один процесс создает другой, он может просто позволить дочернему процессу наследовать строки текущей среды или может дать новому дочернему процессу измененную или даже совершенно новую среду.

См. Полную информацию для CreateProccess () Win32 API

Не существует поддерживаемого способа для дочернего процесса вернуться к родительскому процессу и изменить среду родителя.

Тем не менее, с помощью сценариев CMD и PowerShell родительская командная оболочка может получать выходные данные дочернего процесса и обновлять свою собственную среду. Это обычная техника.

лично, мне не нравятся какие-либо сложные сценарии CMD - они - сука, чтобы написать отладку. Возможно, вы захотите сделать это в PowerShell - конечно, есть кривая обучения, но она гораздо богаче.

2 голосов
/ 30 апреля 2009

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

...