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

공용 : %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 으로만 처리하여 다시 통채로 경로를 가져오게 만들었습니다. 동일한 방법으로 내 문서 등의 다른 경로들도 가져올 수 있습니다.


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

 

 

신고
캐플 블로그에 공개된 글은 반드시 원본 글의 링크를 포함시키는 조건으로 자유롭게 이용하실 수 있습니다.
하지만 블로그의 발전을 위하여 되도록이면 링크로 글을 소개해주시길 부탁드립니다. ^^

- 상업적인 용도의 사이트는 대상에서 제외됩니다. -
- 글에는 오류가 있을 수 있고, 추후 수정 또는 재발행될 수 있습니다. -
  1. 제자 2013.04.28 18:22 신고  댓글주소  수정/삭제  댓글쓰기
    배치파일에서요 변수에 개행문자를 넣고 싶은데요, 이걸 네이버와 구글검색에서 도저히 못찾아서 염치불구하고 질문드립니다
    예>
    set a=가나다
    set b=123
    set c=a개행b <==a와b사이를 개행하고싶은데요 안되네요

    실은 for문에서 쓰고싶은데요
    for %%a in () do (set res=!res!a개행)
    이게 잘안되서 for문안에서 텍스트파일 생성하는식으로 꼼수써서 해결은 했지만 찜찜합니다
    대략 다른언어에서는 개행이 대체적으로 \n이거나 \r\n이잖아요
    str = str+\n <== 대충 이런식으로 쓰잖아요

    위에 해당되는걸 배치파일로 구현해볼려니 배치파일의 개행은 도저히 모르겠습니다
    echo. <== 이걸로도 조합해도 안되고요
    현재 캐플님이 짜신 cmd소스보고 공부해보고있습니다
    • BlogIcon CApple 2013.04.30 00:11 신고  댓글주소  수정/삭제
      배치 파일은 프로그래밍 언어가 아닌지라 그러한 한계는 어쩔 수 없는 듯 합니다. 어쩌면 제가 모르는 방법이 있을지도 모르지만 아무튼 제가 아는 한도 내에서는 변수에 줄 바꿈 기능을 넣는 방법은 없는 것으로 알고 있습니다.
  2. 제자 2013.05.01 12:59 신고  댓글주소  수정/삭제  댓글쓰기
    어쩐지요 눈빠지게 검색해봤는데도요 못찾겠더라고요 ㅠㅠ
    캐플님이 없다라고 하시니, 저도 미련버리고 깔끔하게 포기할려고요
    없는걸 찾았으니...
    이번에도 답변 정말 고맙습니다 (__)
  3. 도와주세요 2017.05.17 12:46 신고  댓글주소  수정/삭제  댓글쓰기
    해당을 이용해서 각 사용자 위치를 확인해서 파일 복사하는 배치파일도 만들수 있을까요?..;;
    예전에 어디서 본거 같은대 찾지를 못하겠네요...
    lsmin@zhnisshin.sina.net으로 메일 한통 주실수있으실까요?

댓글을 달아 주세요

- 댓글에선 예의를 지켜주시기 바라며, 블로그지기는 댓글에서 따로 활동하지 않습니다.

* 티스토리 사용자는 여기를 클릭하시면 로그인 됩니다.

BBCode 안내   굵게 밑줄 기울임 취소선   취소선 취소선 취소선 취소선   왼쪽 정렬 가운데 정렬 오른쪽 정렬   코드박스 인용구 이미지   이미지 업로드-Imgur.com