[완료] (윈도우) .bat 파일에서 사용하는 "%*"와 탐색기에서 파일 형식 편집할 때 쓰는 "%*"의 의미가 다릅니까?

raymundo의 이미지

안녕하세요, 좀 아리송한 경우를 겪어서... 윈도우에서의 문제이긴 한데 제가 달리 활동하는 윈도 관련 커뮤니티도 없고 나름 심오한(?) 문제 같아서... 고수님들 많으신 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 파일에서 쓰는 것과 다르단 말이죠...

"이게 정상입니까?"라고 묻는 건 의미가 없을 거고 (설마 제 컴만 비정상이겠어요 -_-;) 왜 이렇게 다르게 했는지 설명이라도 되어 있는 문서가 있을까 해서 말이죠. 구글은 특수 문자 검색이 안 되어서 "%*" 이런 거 검색으론 힘들군요.

aero의 이미지

perl 스크립트를 윈도우에서 바로 실행시키려면
pl2bat 명령을 사용해서 bat 파일로 변환하면
bat파일이 내부적으로 perl을 bootstraping 해서 실행해주죠

이때 바뀐 bat파일의 첫 부분을 보면 다음과 같이 되어 있습니다.

@rem = '--*-Perl-*--
@echo off
if "%OS%" == "Windows_NT" goto WinNT
perl -x -S "%0" %1 %2 %3 %4 %5 %6 %7 %8 %9
goto endofperl
:WinNT
perl -x -S %0 %*
if NOT "%COMSPEC%" == "%SystemRoot%\system32\cmd.exe" goto endofperl
if %errorlevel% == 9009 echo You do not have Perl in your PATH.
if errorlevel 1 goto script_failed_so_exit_with_non_zero_val 2>nul
goto endofperl
@rem ';
#!/usr/bin/perl
계속

%*를 쓰지 않고 9개 정도면 충분하다고 보는지 그냥 쭉 나열해 놨네요

윈도우에서 pl 확장자를 자동으로 perl해석기로 연결시키려면

ASSOC .pl=PerlScript
FTYPE PerlScript=C:\strawberry\perl\bin\perl.exe %1 %*

이렇게 명령 내려주면 됩니다. (개인적으로는 자동 연결시키는걸 선호하지 않지만..)
지울려면 위 두줄에 =뒷 부분이 없는 명령을 내리면 되고
(딸기 펄은 그렇지 않은데 activestate perl은 설치하면 기본으로 확장자를 연결시킬 겁니다.)

저도 %1 %* 의 의미를 크게 신경쓰지 않았는데 다시 한 번 찾아보니
http://stackoverflow.com/questions/26551/how-to-pass-command-line-parameters-in-batch-file
에 보니
%* to mean "all the rest"
라고 되어 있네요.

ktd2004의 이미지

혹시 hello.pl이 %0이 아닌가요?

raymundo의 이미지

두 분 감사합니다,

일단 KTD님 말씀:

Quote:
혹시 hello.pl이 %0이 아닌가요?

아 어제 적을 때 그 얘기를 빠뜨렸는데, 막판에는 혹시나 싶어서 %1 자리에 %0 을 넣어보기도 하고, 뒤에 다시 넣어보기도 했는데... %1과 %0이 둘 다 hello.pl을 가리키더군요... -_-;;

다음 aero님 말씀:

Quote:

저도 %1 %* 의 의미를 크게 신경쓰지 않았는데 다시 한 번 찾아보니
http://stackoverflow.com/questions/26551/how-to-pass-command-line-parame...
에 보니
%* to mean "all the rest"
라고 되어 있네요.

음 "rest일리가 없는데" 싶어서 좀 이상했는데, 그 페이지에 보면 그 문구 아래에
Edit: Actually, %* means "all", so one would actually need to use shift to do the above:
라고도 적혀 있네요 ^^

.
.
.

어쨌거나, aero님이 알려주신 assoc 과 ftype 명령을 보다가... ftype /? 해서 도움말을 봤거든요... 거기에 정확히 이 얘기가 나와 있더라고요 -ㅅ-;;; (예시도 정확히 펄 얘기)

D:\Temp>ftype /?
파일 확장명 연결에 사용되는 파일 형식을 표시하거나 수정합니다.
 
FTYPE [fileType[=[openCommandString]]]
 
  fileType  찾거나 바꿀 파일 형식을 지정합니다.
  OpenCommandString 이 형식의 파일을 시작할 때 사용할 [열기] 명령을
                    지정합니다.
 
FTYPE를 매개 변수 없이 입력하여 정의한 열기 명령 문자열을
가진 현재 파일 형식을 표시하십시오.  FTYPE는 파일 형식만으로
호출되며, 그 파일 형식에 사용할 현재의 열기 명령 문자열을 표시합니다.
열기 명령 문자열을 지정하지 않으면 FTYPE 명령은 파일 형식에 대한
열기 명령 문자열을 지웁니다. 열기 명령 문자열에서 %0 또는 %1은(는)
연결을 통해 시작될 파일 이름으로 대체됩니다.  %*은(는) 모든 매개 변수를
가져오며, %2은(는) 첫째 매개 변수를 가져오고, %3은(는) 둘째 매개
변수를 가져오는 식입니다. %~n은(는) n째 매개 변수로 시작하는 나머지
매개 변수를 가져오는데 n값은 2에서 9까지의 값입니다. 예를 들면:
 
    ASSOC .pl=PerlScript
    FTYPE PerlScript=perl.exe %1 %*
 
는 Perl 스크립트를 다음과 같이 호출합니다.
 
    script.pl 1 2 3
 
확장 유형에 필요한 확장명을 지우려면 다음과 같이 하십시오:
 
    set PATHEXT=.pl;%PATHEXT%
 
그러면 스크립트는 다음과 같이 호출됩니다.
 
    script 1 2 3

%0과 %1은 똑같이 파일 이름을 가리키고,

%2가 첫번째 매개 변수이고,

%*는 모든 매개 변수랬는데.. 결과적으로 %2부터..

배치 파일에서 사용할 때와 다르군요. 결국 처음 가졌던 의문을 확실하게 확인하는 걸로 끝이라 좀 싱겁습니다만, ftype /? 도움말에서 확실하게 확인하니 좋군요 ^^;

좋은 하루 되세요!

aero의 이미지

ftype 도움말에 Perl이 나오니 왠지 반갑군요 :)

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.