본문 바로가기

Windows/Windows

프로그램이나 경로 작성 시 참고하면 좋은 윈도우 환경 변수

본인은 얼마 전 윈도우의 환경 변수를 알아보아야 할 일이 있어 몇가지 정보를 찾아 다녔고 그 정보에 많은 도움이 되어 혹시나 이 블로그를 읽고 있을 다른 분들에게도 도움을 주기 위해 이 포스팅을 작성합니다.


순수 본인의 경험에 따라 최선의 방법이라 생각하여 이 방법을 기술했고 몇가지 특별한 경우는 다른 글을 찾아보시기 바랍니다.

ex) AD DS 이용 환경에서 관리자 권한 승격 시 관리자 계정 명의로 아래 경로가 구해지는 경우 -> 이 경우는 저도 현재 MS에 문의하고 있습니다.


=================================================


본문만 보기


본인은 얼마 전 프로그램의 사용자 개인 파일을 출력해야 할 일이 있었다.

그런데 처음에 개발할 당시에는 문제가 없었는데, 지인끼리 공유하던 도중 이런 문제가 생겼다.


지인 : "네가 말한대로 내 문서로 이동했는데 설정파일이나 작업 파일이 전혀 없는데?"


이 무슨 귀신 씨나락 까먹는 소린가 싶어 팀퓨어를 통하여 원격으로 직접 살펴보니 실제로 의도한 장소에 파일이 출력되어 있지 않았다.

당시 나는 %USERPROFILE% 이라는 환경 변수를 통하여 파일을 출력하도록 경로를 지정했기 때문에 알아서 사용자의 홈 디렉토리로 경로가 치환될 것이라고 생각했다.


%USERPROFILE%가 무엇인가 한다면 이곳을 참고하자.


하지만 프로그램 출력 시 에러는 발생하지 않았기 때문에(사실 이 때 디버깅 시 전용이라도 좋으니 상세한 로그 출력의 중요성을 깨달았다..orz) 분명 어딘가에 파일이 기록되어 있을 것이라 판단하고 C드라이브 전체를 파일명을 가지고 최근 24시간 이내 파일에 한정하여 검색을 수행했다.


그랬더니 파일이 확실히 기록이 되어 있긴 있었고 내가 의도한 위치에 확실히 기록이 되어 있었으나, 파일 탐색기 상에서는 보이질 않았다.

이상하다 싶어 파일의 경로를 직접 입력해보니 잘 실행이 된다.

하지만 탐색기에서는 숨김 파일 보기를 해도 보이지 않았다.

가끔 이유는 모르겠지만 탐색기 상에서는 숨김 및 시스템 파일 보기를 허용하여도 파일이 보이지 않고 cmd 프롬프트 상에서는 보이는 경우가 있어 이런 경운가 싶어 cmd를 실행하여 아래와 같이 입력하였다.


cd %USERPROFILE%\Document


그랬더니 확실히 내가 출력한 파일이 존재했다.

아니, 파일 존재하였다.


어째서?

나는 그 원인을 찾기 위해 구글링을 수행하였고 아래의 글을 발견하였다.

참고한 출처 : 캐플 블로그 :: 배치 파일에서 바탕 화면, 내 문서, 다운로드와 같은 사용자 폴더의 경로를 정확하게 구하기


확실히 %%로 치환된 경로(Path)를 이용하는건 편리한 방법이나, 이처럼 불특정 다수에게 실행될 프로그램에는 맞지 않는 방법임을 알 수 있었다.


이 글에 따르면 환경 변수의 값과 실제 경로가 사용자 임의 변경으로 다를 수 있음을 알려주었다.

사용자가 임의로 경로를 이동한 경우 환경 변수의 값은 다르게 나올 수도(초기 값대로) 있다는 것이다.

실제 파일 탐색기 상에서는 경로가 문서 라고만 나타났기 때문에 몰랐는데 임의의 파일을 우클릭하여 경로를 확인하니 내가 예상한 경로와 전혀 다른 곳에 존재하였다.


이런 예외사항도 있다는 것을 깨닫고 나는 재빨리 프로그램을 수정해 지금은 잘 작동하고 있다.

방법은 간단한데, 레지스트리에서 위 글에 안내된 경로를 싹 긁어오면 된다.

나의 경우는 문서 에 기록할 것이기 때문에 위 경로에서 Personal 키 값만 긁어오면 되었다.

키를 긁어 가져오도록 프로그램을 변경하여 해당 컴퓨터에서 수행하니 내가 원하는 대로 문서 폴더에 잘 출력이 되어 주었다.


아래는 레지스트리에서 직접 확인이 가능한 유저의 실제 환경 변수의 목록이다.



HKCU\Software\Microsoft\Wiondows\CurrentVersion\Explorer\Shell Folders 에는 실제 시스템이 계정에서 사용하는 경로가 나타나 있다.


우리는 이제 여기서 My Pictures, Personal, AppData, Desktop 등 우리가 원하는 걸 찾아 사용하면 되겠다.

레지스트리에서 값을 가져오는 방법은 개발 환경마다 다르니 별도로 찾아보도록 하자.


PS. 별도의 문제로 위 스크린샷은 현재 관리자 권한으로 레지스트리 편집기가 실행되어 Root 계정으로 실행이 되었다.

이처럼 관리자 권한 행세에 따른 문제가 야기되는 경우도 있는데(서두에서 언급한 대로) 이 부분은 아직 나 또한 이번 해결책을 찾던 도중 발견하여 예외 처리를 위해 문의중이기에 이렇다 할 답은 낼 수 없었다.