윈도우 일반

배치 파일에서 바탕 화면, 내 문서, 다운로드와 같은 사용자 폴더의 경로를 정확하게 구하기

CApple 2012. 11. 24. 13:47

배치 파일에서 작업을 하다보면 바탕 화면, 내 문서, 다운로드와 같은 폴더의 경로가 필요할 때가 있습니다. 일단 이러한 폴더는 크게 공용 폴더와 사용자 폴더 두 가지 종류가 있죠. 일단 공용 폴더와 사용자 폴더가 기본 경로라면 아래와 같은 시스템 변수를 통해 상위 폴더의 경로를 구할 수 있습니다.

공용 : %PUBLIC% [C:\Users\Public]
사용자 : %USERPROFILE% [C:\Users\계정이름]


이 중에서 공용 폴더는 그 위치를 바꾸는 경우가 극히 드믈고, 그리하여 공용 폴더의 위치는 배치 파일에서 시스템 변수인 %PUBLIC% 만으로 처리해도 사실 큰 무리는 없습니다.

공용 바탕화면 : %PUBLIC%\Desktop
공용 다운로드 : %PUBLIC%\Downloads
공용 문서 : %PUBLIC%\Documents
공용 비디오 : %PUBLIC%\Videos
공용 사진 : %PUBLIC%\Pictures
공용 음악 : %PUBLIC%\Music



하지만 사용자 폴더는 %USERPROFILE% 변수만으로 처리하기가 난감합니다. 왜냐하면 많은 분들이 사용자 폴더를 옮겨서 사용하기 때문에 이러한 사용자들은 %USERPROFILE% 변수는 무의미해지죠. 그래서 정확한 사용자 폴더의 위치를 구하기 위해선 사용자 폴더의 위치가 저장되어 있는 레지스트리 정보를 참고해야 합니다. 일단 사용자 폴더의 위치는 아래의 두 레지스트리 키에 그 경로가 저장되어 있습니다.

[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders]
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders]



User Shell Folders 쪽 경로는 시스템 변수로 표현된 경로이고, Shell Folders 는 직접 경로이기 때문에 Shell Folders 쪽 경로를 사용하는 것이 여러모로 좋아 보입니다. 이제 이러한 값들은 Reg Query 명령을 통해 명령 프롬프트 내에서 그 데이터를 확인할 수 있죠. 예를 들어 바탕 화면의 경로인 Desktop 값의 데이터를 확인하면 아래와 같이 출력이 됩니다.

reg query "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" /v "Desktop"



해당 명령을 통해 출력된 세 번째 줄에 출력된 값 중 공백을 기준으로 세 번째 값이 우리가 필요로 하는 값이죠. 이러한 정보를 토대로 For /F 구문을 통해 배치 파일내에서 해당 부분을 추출하려면 아래와 같이 코드를 짜면 됩니다.

클릭해서 보세요

skip=2 : 첫 번째 줄과 두 번재 줄은 건너 뜀.
tokens=3 : 공백을 기준으로 세 번째 값을 가져옴


그런데 이렇게만 끝내기에는 문제가 하나 있습니다. 바로 경로에 공백이(띄어 쓰기) 포함된 경우인데요. 만약에 그렇다면 경로 중간의 공백도 tokens 의 영향을 받아 중간에 짤려버립니다. 그래서 아래와 같이 처리를 해봤습니다.

클릭해서 보세요


일단 경로에 공백이 포함되어 있다고 가정하여 tokens=3* 을 사용하여 경로를 공백 이전 %%a 와 이후 부분 %%b 로 가져온 후 이 둘을 결합하여 DesktopPath 변수로 저장합니다. 그리고 이렇게 가져온 DesktopPath 마지막에 \ 을 붙여서 이를 확인하는 겁니다.

만약에 공백이 있는 경로였다면 정상적으로 경로 마지막에 \ 가 붙어 정상적인 경로가 되지만, 공백이 없는 경로였다면 %%b 의 값이 없기 때문에 경로 마지막에 공백이 하나 포함된 채 \ 가 붙게 됩니다. 즉, 없는 경로가 되는 것이죠.

"공백이없는경로 \"
"공백이 있는 경로\"

이렇게 되면 공백이 없는 경로는 if exist 로 확인했을 때 존재하지 않는 경로가 됩니다. 그래서 이렇게 없는 경로라고 나오면 tokens=3 으로만 처리하여 다시 통채로 경로를 가져오게 만들었습니다. 동일한 방법으로 내 문서 등의 다른 경로들도 가져올 수 있습니다.


요즘 제가 배치 파일을 만들다보면 예전에 다른 곳에서 짜놓은 것을 잊어버리고 처음부터 다시 만들고 있는 현상이 많이 발생하더군요. 나중에 제 배치 파일에서 다시 사용할 지 몰라 정리해보았습니다. 그리고 배치 파일의 활용에 있어선 초보적인 수준이라 코드를 세련되게 만들진 못하겠네요. ^^;; 이상입니다. ^^