2009-05-29 5 views
3

Можно ли сохранить переменную окружения в консольном приложении, которое доступно после выхода процесса.Сохранять переменные окружения после выхода из приложения

Я хочу, чтобы консольное приложение установило строку, которая доступна для исполняемого файла пакета.

Консольное приложение находится в dotnet.

ответ

5

Вы можете использовать Environment.SetEnvironmentVariable:

Environment.SetEnvironmentVariable("SomeVariable", "Some value", EnvironmentVariableTarget.User); 

Последний параметр определяет объем и срок службы переменной (либо процесса, компьютера или пользователя). Если вы хотите установить переменную для машины, вам нужно будет запустить ее как admin.

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

Редактировать 2: Хорошо, я копался в этом, и, похоже, нет очевидного способа получить пакетный файл с обновленным набором переменных окружения. Один обходной путь, который я нашел, состоит в том, чтобы иметь .net-код для написания командного файла для установки переменных вместо их установки. Вызывающий пакетный сценарий может затем запустить созданный пакетный файл, что среда создана:

.Net Console App:

static void Main(string[] args) 
{ 
    string outputFile = @"c:\temp\setvars.bat"; 
    string variable = "set SomeVariable=Some value"; 
    File.WriteAllText(outputFile, variable); 
} 

BAT-файл:

call myconsoleapp.exe 
call c:\temp\setvars.bat 
echo %SomeVariable% 
+0

Вы избили меня до него. Я думаю, что это неплохое решение, и в моем ответе я немного изменился. Я не думаю, что есть какой-то другой «хороший» способ сделать это. – Xiaofu

+0

Это решение работало красиво, жаль, что это ограничение для переменных среды, но обходное решение будет сделано. – benPearce

0

Да, установить систему вместо переменной среды процесса. (Я думаю, что технически переменная User evironment также сохранится, но только для контекстов этого пользователя).

Используйте класс system.environment, чтобы перейти к методу SetEnvironmentVariable.

+0

Это не выходит за рамки процесса. После выхода из этой среды переменная окружения недоступна из сценария, который ее вызвал. Однако я не уверен, что вы имели в виду «переменная системной среды». В перечислении EnvironmentVariableTarget есть только значения Process, User and Machine. –

+0

* переменные процесса * сохраняются только для объема процесса. Пользовательские переменные среды хранятся в HKCU и загружаются при создании процесса для этого пользователя. Переменные System (Machine) хранятся в HKLM и загружаются, когда в этой логической машине создается любой процесс оболочки. – RBarryYoung

3

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

Попробуйте использовать Environment.SetEnvironmentVariable с помощью пользователя или машины EnvironmentVariableTarget. Затем вы сможете получить от него пакетный файл с чем-то вроде% my_var%.

Environment.SetEnvironmentVariable("my_var", "data", EnvironmentVariableTarget.User); 

EDIT: Фредрик там бил меня к нему с подобным решением, и я согласен, что это известно поведение переменных окружения. Я собирался предложить, чтобы ваше приложение C# записало строки, которые вы хотите вернуть в текстовый файл, а затем проанализируйте их в своем пакетном файле. Например:

for /f "tokens=1,2 delims=," %%a in (data.txt) do (
if %%a==env1 echo %%b 
if %%a==env2 echo %%b 
) 

... где data.txt может выглядеть следующим образом:

env1,hello 
env2,there 
4

Это похоже на Xiaofu, за исключением, что вы можете пропустить этот текстовый файл в целом и иметь вашу программу записи данные на консоль.Поставить галочки вокруг имени программы, чтобы иметь пакетный файл выполнить его и использовать выход, как это:

for /f "tokens=1,2 delims=," %%a in ('MyProgram.exe') do (
    set %%a=%%b 
    set %%a=%%b 
) 

Если вы хотите выводить другие строки текста, которые должны быть проигнорированы, то вы можете добавить фильтр внутри для цикла.

Смежные вопросы