%~dp0

2009.08.19 08:10 | 컴퓨터 관련 팁

최근에 해외 어둠의 툴 배치스크립트를 보고 위 변수(?)를 보게 되었는데 해당 배치파일의 실행폴더를 그대로 받아주더군요.

 

비스타에선 문제가 없었던 것 같은데 윈도우 7의 경우 UAC가 켜져있는 상태로 배치파일에 우클릭 해서 관리자 권한으로 실행을 하면 System32 경로에서 스크립트가 실행되기 때문에 파일 복사시에 지정된 경로를 찾지 못해서 에러가 발생하는 문제가 있었습니다.

 

이제 관리자 권한이 필요하면서 동시에 파일 복사 명령어가 들어가는 스크립트 실행시 더이상 Admin 계정을 활성화 시켜셔 스크립트를 실행할 필요는 없을 것 같습니다.

 

 

 

 

 

(예제)

 

※ data 라는 폴더와 배치파일이 동일한 위치에 존재하는 경우를 가정

 

xcopy data\spp\tokens %windir%\System32\spp\tokens /cheriky

 

위와같은 명령줄이 배치파일에 들어있는 경우 만약 UAC 켜진 상태로 우클릭해서 관리자 권한으로 실행했다면

 

C:\Windows\System32\data\spp\tokens

 

라는 경로를 찾기 때문에 지정된 경로를 찾을 수 없다고 나오면서 복사 에러가 납니다.

 

하지만

 

xcopy %~dp0data\spp\tokens %windir%\System32\spp\tokens /cheriky

 

라고 넣으면 UAC가 켜져있는 상태에서 우클릭 - 관리자 권한으로 실행을 했다고 하더라도 정상적으로 파일 복사가 이루어집니다.

 

 

 

(추가1)

가만히 생각해보니 그냥 스크립트 시작 부분에

 

cd "%~dp0"

 

를 넣어서 실행 위치를 System32에서 배치파일이 존재하는 위치로 이동시킨 다음 작업하는게 편리할 것 같네요 ^^

 

 

 

(추가2)

cd 명령어는 디렉터리 변경만 가능하고 드라이브가 다르면 옮겨지지 않습니다.

따라서 해당 파일이 윈도우가 설치된 파티션과 다른 드라이브에 있다면

 

pushd "%~dp0"

 

해주시면 스크립트 위치로 이동이 됩니다.

 

  1. BlogIcon 까만거
    2009.08.19 09:04 신고

    보안을 공부하고 있는데.. 보안적인 측면에서도 상당히 유용한 정보가 되겠네요. 좋은 정보 감사합니다.

    • BlogIcon snoopy
      2009.08.19 09:50 신고
      수정 및 삭제

      그런가요? 전 초보라서 이게 보안에 어떤 의미를 가지는지는 잘 모르겠네요 ㅎ

  2. BlogIcon 아무개
    2009.08.19 09:33 신고

    쉽게 말해서 이런 건가요?

    어떤 곳에 a라는 디렉토리가 있습니다.
    a라는 디렉토리에는 배치파일과 data 폴더가 있고.
    배치파일은 data 폴더에 있는 파일을 D:/archive로 옮기는 일을 합니다.

    이 때 xcopy /data d:/archive로 하면 에러가 나지만 xcopy %~dp0/data d:/archive로 한다면 잘 된다는 거죠?
    제가 이해하는 게 맞다면 이거 대박이네요. 감사합니다.

    • BlogIcon snoopy
      2009.08.19 09:54 신고
      수정 및 삭제

      그런 개념인거 같은데 이 현상은 윈도우 7에서 배치스크립트를 UAC가 켜진 상태에서 우클릭 - 관리자 권한으로 실행했을 때만 발생하는 문제더군요. 그냥 더블클릭으로 실행하거나 관리자 계정에서 실행하거나 UAC가 꺼진 상태에서 실행하면 스크립트가 해당 폴더 위치에서 바로 실행이 되어서 아무런 문제가 없었습니다. 즉 일반적으론 그냥 스크립트와 DATA 라는 폴더가 같은 위치에 존재한다면 data 라는 경로만 넣어도 된다는 것이지요.

    • BlogIcon 아무개
      2009.08.19 10:02 신고
      수정 및 삭제

      아, 그렇군요.좋은 정보 감사합니다. (__)
      그런데 혹시 .iso를 어느 디렉토리에 푸는 전문 MS의 無GUI 툴이 혹시 있나요? 테크넷 뒤져보니 OSCDIMG가 .iso 푸는 것 빼고 AIK에는 없는 것 같은디..

    • BlogIcon snoopy
      2009.08.19 12:39 신고
      수정 및 삭제

      oscdimg에 그런 기능이 있나요? 일단 저는 MS 툴중에 ISO 푸는게 있는지는 모르겠습니다.

    • BlogIcon 아무개
      2009.08.19 15:03 신고
      수정 및 삭제

      잘못 쓴 겁니다. OSCDIMG는 압축만 하는 것으로 알고 있는데..^^;;

  3. BlogIcon EXCEED
    2009.08.19 09:55 신고

    그렇다면.. UAC켜져있구 배치파일로 파일을 복사하려면 %~dp0를 써야한다는 건데....
    이거 엄밀히 따지면 win7의 결함이 아닌가요?
    관리자 권한 실행의 유연성이 떨어지는 좋은 예시네요.

    • BlogIcon snoopy
      2009.08.19 09:58 신고
      수정 및 삭제

      "UAC 켜져있는 상태에서 우클릭 해서 관리자 권한으로 배치스크립트를 실행했을 경우"

      라고 해야겠네요. 비스타에선 분명 문제가 없었던 것 같은데...

  4. BlogIcon 만두사랑
    2009.08.19 12:28 신고

    오호! 신기하네요..오늘도 또 하나 배워갑니다..

    • BlogIcon snoopy
      2009.08.19 12:44 신고
      수정 및 삭제

      이런거 관련해서 특정 문자열 받아주는 변수가 많이 있긴 있던데 저도 공부 좀 해보려니 귀찮아서 ^^;;

  5. BlogIcon Kals R. Styner
    2009.08.19 12:49 신고

    EXCEED님 말씀이랑은 조금 다른 생각입니다.
    일곱이의 결함이라기 보다 보안성에서 더 높은 우위와 안정성을 유지하려 그러는것 같네요. 뭐 팩킹하는 사람들의 악용을 막기 위해서 그러는 것 같습니다.
    모두가 잘 사용하기 위해서 하는 분들도 계시지만, 더러 악용하는 사람들이 있으니 말이죠. SYSTEM32폴더는 윈도우에서 중추에 해당하는 곳이라서 말이죠.
    덕분에 괜찮은 걸 얻고 가네요. ^^

  6. BlogIcon deVbug
    2009.08.19 13:35 신고

    이 글 보고 문뜩 뭔가 떠올라서 관련된 실험을 하나 해보려고 준비 중인데 어떤 결과가 나올지 궁금하네요. ;ㅁ;

  7. BlogIcon Bardisch
    2009.08.19 14:27 신고

    좋..좋은 변수다!

  8. BlogIcon 작은아빠
    2009.08.19 15:46 신고

    한여름의 중간에 무더운데 잘지내시는가 항상 많은정보 공유해줘 수고가 많군요 더위에 건강 조심하시길 지나가다가 흔적 남깁니다~

    • BlogIcon snoopy
      2009.08.19 15:59 신고
      수정 및 삭제

      제가 일하는(?) 곳과 사는 집에 에어컨은 마음대로 빵빵하게 틀 수 있어서 여름 더운줄 모르고 지내고 있습니다. ^^

  9. BlogIcon 무느미
    2009.08.19 16:18 신고

    스크립트 소스가 어디서 많이 본거네요. 하하.

    이왕 하려면, 좀더 알기 쉽게 네이밍 좀 하지,
    "%~dp0"게 뭡니까...
    마소 msdn 펑션들은 이름 길게 잘 해놨더만, 이건 왜 이렇게 한건지...

    • BlogIcon snoopy
      2009.08.19 16:24 신고
      수정 및 삭제

      for /?

      해보니까 도움말에 %~ 관련 변수가 많이 나오더라구요. 근데 전 무슨말인지 몰라서 ㅎㅎ for 구문 익혀두면 스크립트 짜는데 참 유용하겠던데 ㅠㅠ

  10. BlogIcon Digital NEX
    2009.08.20 14:19 신고

    핫ㅋㅋ 들어와봤더니 배치에 대한 포스팅이 있군요.

    요즘 배치가지고 별짓다하는 저한테는 상당히 솔깃한 포스팅이네요 ㅎㅎ

    참고로 더 알려드리자면

    %~d0 드라이브(drive)
    %~p0 경로(path)
    %~n0 파일명(name)
    %~x0 확장자(이건 컴맹이라 모르겠습니다 T^T)

    이렇습니다. %~이후문자는 맘대로 써도 됩니다.

    %~dpnx0 이렇게쓰면 드라이브 경로 파일명 확장자가 전부뜹니다 ㅋ

  11. BlogIcon hongyang
    2010.11.14 12:46 신고

    앗 실험해야겠다. 이걸로
    %~I - 따옴표(")를 제거하는 %I을 확장합니다.
    %~fI - %I을 전체 인정된 경로 이름으로 확장합니다.
    %~dI - %I을 드라이브 문자로만 확장합니다.
    %~p - %I을 경로로만 확장합니다.
    %~nI - %I을 파일 이름으로만 확장합니다.
    %~xI - %I을 파일 확장명으로만 확장합니다.
    %~sI - 확장된 경로가 짧은 이름만 가지고 있습니다.
    %~aI - %I이 파일의 파일 속성으로만 확장합니다.
    %~tI - %I을 파일의 날짜/시간으로만 확장합니다.
    %~zI - %I을 파일 크기로만 확장합니다.
    %~$PATH:I - PATH 환경 변수 목록에 있는
    디렉터리를 찾고 %I을 처음으로 찾은
    전체 인정된 파일 이름으로 확장합니다.
    환경 변수 이름이 정의되지 않았거나
    찾기에서 파일을 찾지 못하면
    이 구문에서 빈 문자열로 확장합니다
    %~dpI - %I을 드라이브 문자와 경로로만 확장합니다.
    %~nxI - %I을 파일 이름과 확장명으로만 확장합니다.
    %~fsI - %I 을 짧은 이름을 가진 전체 경로 이름으로만 확장합니다.
    %~dp$PATH:i - %I에 대한 PATH 환경 변수 목록에 있는
    디렉터리를 찾고 처음 찾은 것의
    드라이브 문자와 경로로 확장합니다.
    %~ftzaI - %I을 출력줄과 같은 DIR로 확장합니다.
    %I는 아무 변수를 뜻합니다. 그러므로 %I는 %A가 될 수 있고 뜻은 snoopy가 될 수 있고 아주 매우 다양합니다. 그러므로 변수가 %D고 파일 확장명을 확장하고 싶다면 %~xD하면 되겠죠.

    • BlogIcon hongyang
      2010.11.14 12:29 신고
      수정 및 삭제

      실험 보고서
      실험 제목:%~0이란?
      실험 목적:%~0이라는 변수의 의미를 알 수 있다.
      실험 날짜:2010년 11월 14일
      실험 내용:각각 @echo %~0
      @pause를 C드라이브에 hongyang.cmd와 hongyang.bat로 저장한다.
      그리고 hongyang.cmd를 실행시켜보면 C:\hongyang.cmd와 계속하려면 아무 키나 누리시오가 나온다. hongyang.bat을 실행시키면 C:\hongyang.bat와 계속하려면 아무 키나 누르시오.가 나온다. 그럼 set APEL=C:\hongyang.cmd를 명령하고 echo %~dAPLE를 하면 걍 echo %~dAPLE이 나온다.그러므로 %~변수는 for명령에서만 사용할 수 있으며 %~0은 파일의 드라이브명과 경로(파일 이름.확장자까지)가 나온다는 것을 알수 있다.그러므로 %~dp0은 %~dpI를 응용한 것이다.그러므로 echo %~z0명령을 하면 2KB가 나오고 echo %~t0하면 11월 14일 12시 29분이 나온다.

    • BlogIcon snoopybox
      2010.11.14 12:56 신고
      수정 및 삭제

      제 블로그가 홍양님 일기장인가요 ;;