2009-05-29 19 views
3

프로세스를 종료 한 후 사용할 수있는 콘솔 응용 프로그램에서 환경 변수를 유지할 수 있습니까?응용 프로그램 종료 후 환경 변수 유지

콘솔 응용 프로그램이 실행 한 배치 파일에 사용할 수있는 문자열을 설정하기를 원합니다.

콘솔 응용 프로그램이 dotnet 형식입니다.

답변

5

당신은 Environment.SetEnvironmentVariable를 사용할 수 있습니다

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

마지막 매개 변수는 변수 (중 프로세스, 사용자 또는 기계)의 범위와 수명을 결정합니다. 머신의 변수를 설정하려면 admin으로 실행해야합니다.

편집 : 위의 코드와 콘솔 응용 프로그램을 실행하는 경우 (새 명령 창을 열 때까지, 환경 변수를 사용할 수없는 것을 비록 나는 알 않도록 배치 파일에서 콘솔 응용 프로그램을 실행, 변수 경우 는 환경 변수 집합을 새로 고칠 수있는 트릭이 없으면 배치 파일에서 사용할 수 없습니다.

편집 2 : 좋아요, 이것으로 주위를 파고 있었고 배치 파일에 새로 고친 환경 변수 세트를 가져 오는 분명한 방법이없는 것 같습니다. 한 가지 해결 방법은 .net 코드가 자체를 설정하는 대신 변수를 설정하기위한 배치 파일을 작성하도록하는 것입니다. 다음 생성 된 배치 파일을 실행할 수 호출 배치 스크립트는 환경을 설정 한합니다 :

.NET 콘솔 응용 프로그램 :

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

당신은 나를 때렸다. 나는 이것이 꽤 좋은 해결책이라고 생각한다. 그리고 나는 약간 다른 대답을 내 대답으로 가지고 있었다. 나는 다른 좋은 방법을 생각하지 않습니다. – Xiaofu

+0

이 솔루션은 아름답게 작동합니다. 환경 변수에 대한 제한이 있지만, 해결 방법이 있습니다. – benPearce

0

예, 시스템 설정 : BAT 파일이

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

환경 변수 대신 프로세스 환경 변수를 사용하십시오. (기술적으로는 사용자 환경 변수도 지속되지만 해당 사용자의 컨텍스트에만 해당한다고 생각합니다.)

System.environment 클래스를 사용하여 SetEnvironmentVariable 메서드를 가져옵니다.

+0

이것은 프로세스 범위를 벗어나지 않습니다. 종료하면 환경 변수를 호출 한 스크립트에서 환경 변수를 사용할 수 없습니다. 그러나 "System environment variable"에 의해 당신이 언급 한 것이 확실하지 않습니다. EnvironmentVariableTarget 열거 형은 Process, User 및 Machine 값만 갖습니다. –

+0

* process * 변수는 프로세스의 범위 내에서만 유지됩니다. 사용자 환경 변수는 HKCU에 저장되며 해당 사용자에 대한 프로세스가 만들어지면로드됩니다. 시스템 (기계) 변수는 HKLM에 저장되며 해당 논리 시스템에 셸 프로세스가 만들어지면로드됩니다. – RBarryYoung

3

배치 파일에서 읽을 수 있기를 원하므로 기존 환경 변수를 사용하는 것이 제한적일 수 있습니다.

Environment.SetEnvironmentVariableEnvironmentVariableTarget (사용자 또는 기계)을 사용해보십시오. 그런 다음 % my_var %와 같은 것으로 배치 파일에서 가져올 수 있어야합니다.

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

는 편집 : 프레드릭이 유사한 솔루션으로 날 이길, 나는이 환경 변수에 대한 동작을 알려져 동의합니다. C# 응용 프로그램에서 텍스트 파일로 반환 할 문자열을 작성한 다음 배치 파일에서 구문 분석하도록 제안하려고했습니다. data.txt로 같이 보일 수 있습니다

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

... : : 예를 들어 당신이 모두 텍스트 파일을 건너 뛰고 프로그램 쓰기를 할 수 있습니다 것을 제외하고

env1,hello 
env2,there 
4

이, Xiaofu의 유사합니다 콘솔에 데이터.배치 파일을 실행하고이 같은 출력을 사용하도록 프로그램 이름 주위에 틱을 넣어 : 당신이 원하는 경우 무시해야 텍스트의 출력을 다른 라인에

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

을, 당신은 내부에 필터를 추가 할 수 있습니다 for-loop.

관련 문제