[완료] (윈도우) .bat 파일에서 사용하는 "%*"와 탐색기에서 파일 형식 편집할 때 쓰는 "%*"의 의미가 다릅니까?
안녕하세요, 좀 아리송한 경우를 겪어서... 윈도우에서의 문제이긴 한데 제가 달리 활동하는 윈도 관련 커뮤니티도 없고 나름 심오한(?) 문제 같아서... 고수님들 많으신 KLDP에 좀 여쭤봅니다 ^^
환경 : 윈도우XP SP2 입니다.
명령 프롬프트 창에서 배치 파일 (.bat)을 실행할 때, 뒤에 인자를 다음과 같이 주면
C:\> hello.bat hello KPUG users
배치 파일 안에서는 각각의 인자가 다음 변수에 들어가는 걸로 압니다. (오늘에서야 웹 보고 안 거지만;;)
%0 - hello.bat (프로그램 자체) %1 - hello (첫번째 인자) %2 - KPUG (두번째 인자) %3 - users ... %* - hello KPUG users (모든 인자)
(만일 bash 쉘이었다면 각각 $0, $1, ..., $* 였겠죠)
이건 간단한 .bat 파일을 만들어서 각 변수를 echo 로 출력하게 해서 확인을 했습니다. 여기까지는 OK
.
.
.
.
윈도우에서 Perl 언어로 작성한 스크립트 (.pl) 파일을 실행하기 위해서는, 기본적으로 perl.exe 인터프리터를 실행하고 그 뒤에 스크립트 이름을 인자로 주고, 다시 그 뒤에 그 스크립트에 넘어갈 인자를 줍니다.
C:> perl.exe D:\work\hello.pl hello KPUG users
근데 이게 너무 귀찮단 말이죠... Linux에서는 스크립트 파일에 실행 퍼미션 주면 그냥 스크립트 이름만 쳐도 되잖아요. 그래서 똑같은 효과를 보려고 다음과 같이 했습니다.
윈도우 탐색기 - 폴더 옵션 - 파일 형식 - .PL 선택 - 고급 - 동작 새로 만들기 들어가서 다음과 같이 등록
명령: Open 명령을 실행할 응용 프로그램: D:\strawberry\perl\bin\perl.exe "%1"
자, 이제
D:\work> hello.pl
이라고만 하면 자동으로
D:\work> perl.exe "hello.pl"
형태로 실행이 됩니다... 그런데 그 뒤에 인자가 안 넘어가더군요.
.
.
그래서 탐색기 옵션 다시 들어가서, 뒤에다가 %* 를 추가했습니다.
명령을 실행할 응용 프로그램: D:\strawberry\perl\bin\perl.exe "%1" %*
이제 제가 원하는 대로,
D:\work> hello.pl hello KPUG users
하면 자동으로
D:\work> perl.exe "hello.pl" hello KPUG users
로 실행이 됩니다... 그래서 모든 문제가 해결되긴 했는데...
.
.
.
어째서???
%* 는 %1부터 포함하므로, 저 상태라면 %1 이 두 번 등장하잖아요? ("%1" 에서 한번, %* 에서 다시 한번) 즉
> hello.pl hello KPUG users 이것은 > perl.exe "hello.pl" hello.pl hello KPUG users <-- hello.pl 이 두 번 등장해야 되지 않는가
즉 이 때는 "%*"가 "%1"부터 포함되는 게 아니라 "%2" 부터 포함되는 것 같은데, 이건 .bat 파일에서 쓰는 것과 다르단 말이죠...
"이게 정상입니까?"라고 묻는 건 의미가 없을 거고 (설마 제 컴만 비정상이겠어요 -_-;) 왜 이렇게 다르게 했는지 설명이라도 되어 있는 문서가 있을까 해서 말이죠. 구글은 특수 문자 검색이 안 되어서 "%*" 이런 거 검색으론 힘들군요.
흠
perl 스크립트를 윈도우에서 바로 실행시키려면
pl2bat 명령을 사용해서 bat 파일로 변환하면
bat파일이 내부적으로 perl을 bootstraping 해서 실행해주죠
이때 바뀐 bat파일의 첫 부분을 보면 다음과 같이 되어 있습니다.
%*를 쓰지 않고 9개 정도면 충분하다고 보는지 그냥 쭉 나열해 놨네요
윈도우에서 pl 확장자를 자동으로 perl해석기로 연결시키려면
이렇게 명령 내려주면 됩니다. (개인적으로는 자동 연결시키는걸 선호하지 않지만..)
지울려면 위 두줄에 =뒷 부분이 없는 명령을 내리면 되고
(딸기 펄은 그렇지 않은데 activestate perl은 설치하면 기본으로 확장자를 연결시킬 겁니다.)
저도 %1 %* 의 의미를 크게 신경쓰지 않았는데 다시 한 번 찾아보니
http://stackoverflow.com/questions/26551/how-to-pass-command-line-parameters-in-batch-file
에 보니
%* to mean "all the rest"
라고 되어 있네요.
혹시 hello.pl이 %0이
혹시 hello.pl이 %0이 아닌가요?
두 분
두 분 감사합니다,
일단 KTD님 말씀:
아 어제 적을 때 그 얘기를 빠뜨렸는데, 막판에는 혹시나 싶어서 %1 자리에 %0 을 넣어보기도 하고, 뒤에 다시 넣어보기도 했는데... %1과 %0이 둘 다 hello.pl을 가리키더군요... -_-;;
다음 aero님 말씀:
음 "rest일리가 없는데" 싶어서 좀 이상했는데, 그 페이지에 보면 그 문구 아래에
Edit: Actually, %* means "all", so one would actually need to use shift to do the above:
라고도 적혀 있네요 ^^
.
.
.
어쨌거나, aero님이 알려주신 assoc 과 ftype 명령을 보다가... ftype /? 해서 도움말을 봤거든요... 거기에 정확히 이 얘기가 나와 있더라고요 -ㅅ-;;; (예시도 정확히 펄 얘기)
%0과 %1은 똑같이 파일 이름을 가리키고,
%2가 첫번째 매개 변수이고,
%*는 모든 매개 변수랬는데.. 결과적으로 %2부터..
배치 파일에서 사용할 때와 다르군요. 결국 처음 가졌던 의문을 확실하게 확인하는 걸로 끝이라 좀 싱겁습니다만, ftype /? 도움말에서 확실하게 확인하니 좋군요 ^^;
좋은 하루 되세요!
ftype 도움말에 Perl이
ftype 도움말에 Perl이 나오니 왠지 반갑군요 :)
댓글 달기