Windows 명령 행에서 배치 파일에서 매개 변수 사용


161

Windows에서 배치 파일이 실행될 때 전달 된 인수에 어떻게 액세스합니까?

예를 들어라는 프로그램이 있다고 가정 해 봅시다 hello.bat. hello -aWindows 명령 행에 입력 할 때 -a인수로 전달 된 프로그램을 프로그램에 알리 려면 어떻게해야합니까?


명령 줄 매개 변수를 배치 파일로 전달하는 방법 : stackoverflow.com/questions/26551/…
Eric Leschinski

3
"DOS 명령 줄"을 언급합니다.
David R Tribble

답변:


287

이미 다른 사람이 말했듯이, 명령 줄을 통해 전달 된 매개 변수는 표기법 배치 파일에 액세스 할 수 있습니다 %1%9. 사용할 수있는 다른 두 가지 토큰도 있습니다.

  • %0명령 줄에 지정된 실행 파일 (배치 파일) 이름 .
  • %*명령 줄에 지정된 모든 매개 변수 - 다른 프로그램에 매개 변수를 전달하려면이 매우 유용합니다.

단순히 매개 변수에 액세스하는 방법 외에도 알아야 할 중요한 기술이 많이 있습니다.

매개 변수가 전달되었는지 확인

이것은 IF "%~1"==""인수가 전혀 전달되지 않은 경우에만 true 와 같은 구문으로 수행됩니다 . ~의 값에서 따옴표를 제거하는 물결표 문자를 주목하십시오 %1. 물결표가 없으면 구문 오류 가능성을 포함하여 값에 큰 따옴표가 포함되어 있으면 예기치 않은 결과가 발생합니다.

9 가지 이상의 주장 다루기 (또는 삶을 더 쉽게 만들기)

9 개 이상의 인수에 액세스해야하는 경우 명령을 사용해야합니다 SHIFT. 이 명령은 이동 한 곳 모든 인수의 값을, 그 정도로 %0의 값을 취하고 %1, %1의 값을 취하는 %2등, %9호출 전에 변수를 통해 제공되지 않은, (있는 경우) 열 번째 인수의 값을 취한다 SHIFT(입력 SHIFT /?더 많은 옵션에 대한 명령 ).

SHIFT매개 변수를 특정 순서로 표시하지 않아도 매개 변수를 쉽게 처리하려는 경우에도 유용합니다. 예를 들어, 스크립트가 플래그를 인식 할 수 -a-b임의의 순서로한다. 이러한 경우 명령 행을 구문 분석하는 좋은 방법은

:parse
IF "%~1"=="" GOTO endparse
IF "%~1"=="-a" REM do something
IF "%~1"=="-b" REM do something else
SHIFT
GOTO parse
:endparse
REM ready for action!

이 체계를 사용하면 매우 복잡한 명령 행을 제정하지 않고 구문 분석 할 수 있습니다.

배치 매개 변수의 대체

파일 이름을 나타내는 매개 변수의 경우, 쉘은 다른 방식으로는 액세스 할 수없는 파일 작업과 관련된 많은 기능을 제공합니다. 이 기능은로 시작하는 구문으로 액세스됩니다 %~.

예를 들어, 인수로 전달 된 파일의 크기를 얻으려면

ECHO %~z1

배치 파일이 시작된 디렉토리의 경로를 얻으려면 (매우 유용합니다!)

ECHO %~dp0

CALL /?명령 프롬프트 에 입력하여 이러한 기능의 전체 범위를 볼 수 있습니다 .


4
: parse, : endparse 구문은 GOTO에서도 아름다움입니다. 감사! (내 말은, 도스-BASIC은 GOTO를 강제)
mmrtnt

1
이 기술은 powershell에서 BAT를 호출 할 때 실패 할 수 있습니다. 따옴표 붙은 인수 "name=John"name Johnexe 도중에됩니다. 해결 방법은 작은 따옴표로 '"name=John"'
묶는 것입니다

1
내가없이 얼마나 오래 갔 CALL /?습니까!? 여기에서 나는 항상 구글과 충돌했습니다.
bigtlb

@Jon cmd를 통해 호출하면 하나의 코드 echo % 1 만 포함하는 bat 파일을 작성했습니다. 시작 또는 끝의 매개 변수에서 작동하지 않습니다. 다른 텍스트는 정상적으로 작동합니다.
Alex Mathew

56

배치 파일에서 매개 변수 사용 : % 0 및 % 9

배치 파일은 토큰 : %0to 로 매개 변수로 전달 된 단어를 참조 할 수 있습니다 %9.

%0 is the program name as it was called.
%1 is the first command line parameter
%2 is the second command line parameter
and so on till %9.

명령 행에 전달 된 매개 변수는 영숫자 문자 여야하며 공백으로 구분해야합니다. %0호출 된 프로그램 이름 이므로 %0부팅시 시작되면 DOS 에서 AUTOEXEC.BAT에 대해 비어 있습니다.

예:

다음 명령을 배치 파일에 넣습니다 mybatch.bat.

@echo off
@echo hello %1 %2
pause

배치 파일을 다음과 같이 호출하면 다음과 같이 mybatch john billy출력됩니다.

hello john billy

배치 파일에 대해 9 개 이상의 매개 변수를 가져 오려면 다음을 사용하십시오. % *

퍼센트 백분율 토큰 %*은 "나머지 매개 변수"를 의미합니다. for 루프를 사용하여 여기에 정의 된대로이를 사용할 수 있습니다.

http://www.robvanderwoude.com/parameters.php

배치 매개 변수의 분리 문자에 대한 참고 사항

명령 행 매개 변수의 일부 문자는 DOS 버전, "이스케이프"여부에 따라 배치 파일에 의해 무시되며, 종종 명령 행에서의 위치에 따라 다릅니다.

commas (",") are replaced by spaces, unless they are part of a string in 
double quotes

semicolons (";") are replaced by spaces, unless they are part of a string in 
double quotes

"=" characters are sometimes replaced by spaces, not if they are part of a 
string in double quotes

the first forward slash ("/") is replaced by a space only if it immediately 
follows the command, without a leading space

multiple spaces are replaced by a single space, unless they are part of a 
string in double quotes

tabs are replaced by a single space

leading spaces before the first command line argument are ignored

5

배치 파일은 할당 할 변수 인 경우 프로그램 뒤에 자동으로 텍스트를 전달합니다. 그들은 전송 된 순서대로 전달됩니다. 예를 들어 % 1은 프로그램이 호출 된 후 전송 된 첫 번째 문자열입니다.

Hello.bat가 있고 내용이 다음과 같은 경우

@echo off
echo.Hello, %1 thanks for running this batch file (%2)
pause

그리고 당신은 통해 배치 명령을 호출

hello.bat APerson241 % date %

이 메시지를 다시 받아야합니다.

안녕하세요, APerson241이 배치 파일을 실행 해 주셔서 감사합니다 (2013 년 1 월 11 일)


4

@ Jon 's :parse/:endparse scheme은 훌륭한 출발이며, 그는 초기 패스에 대해 감사를 표하지만 Windows 고문 배치 시스템을 사용하면 쉽게 해결할 수 있다고 생각한다면 ... 내 친구, 당신은 충격을 받고 있습니다. 나는 하루 종일이 악마와 함께 보냈고, 많은 고통스러운 연구와 실험 끝에 마침내 실용 유틸리티를 위해 실행 가능한 것을 관리했습니다.

유틸리티를 구현하고 싶다고하자 foobar. 초기 명령이 필요합니다. 여기에는 선택적--foo을 갖는 선택적 매개 변수 가 있습니다 (물론 다른 매개 변수 일 수는 없음). 값이 없으면 기본값은 입니다. 또한 필요한 값 을 취하는 선택적 매개 변수 가 있습니다. 마지막으로 값이 허용되지 않은 플래그 를 사용할 수 있습니다. 아, 그리고 이러한 매개 변수는 어떤 순서로든 올 수 있습니다.default--bar--baz

다시 말해, 다음과 같이 보입니다 :

foobar <command> [--foo [<fooval>]] [--bar <barval>] [--baz]

복잡한? 아니, 그것은 실제 유틸리티의 전형적인 것 같습니다. ( git누구?)

더 이상 고민하지 않으면 여기에 해결책이 있습니다.

@ECHO OFF
SETLOCAL
REM FooBar parameter demo
REM By Garret Wilson

SET CMD=%~1

IF "%CMD%" == "" (
  GOTO usage
)
SET FOO=
SET DEFAULT_FOO=default
SET BAR=
SET BAZ=

SHIFT
:args
SET PARAM=%~1
SET ARG=%~2
IF "%PARAM%" == "--foo" (
  SHIFT
  IF NOT "%ARG%" == "" (
    IF NOT "%ARG:~0,2%" == "--" (
      SET FOO=%ARG%
      SHIFT
    ) ELSE (
      SET FOO=%DEFAULT_FOO%
    )
  ) ELSE (
    SET FOO=%DEFAULT_FOO%
  )
) ELSE IF "%PARAM%" == "--bar" (
  SHIFT
  IF NOT "%ARG%" == "" (
    SET BAR=%ARG%
    SHIFT
  ) ELSE (
    ECHO Missing bar value. 1>&2
    ECHO:
    GOTO usage
  )
) ELSE IF "%PARAM%" == "--baz" (
  SHIFT
  SET BAZ=true
) ELSE IF "%PARAM%" == "" (
  GOTO endargs
) ELSE (
  ECHO Unrecognized option %1. 1>&2
  ECHO:
  GOTO usage
)
GOTO args
:endargs

ECHO Command: %CMD%
IF NOT "%FOO%" == "" (
  ECHO Foo: %FOO%
)
IF NOT "%BAR%" == "" (
  ECHO Bar: %BAR%
)
IF "%BAZ%" == "true" (
  ECHO Baz
)

REM TODO do something with FOO, BAR, and/or BAZ
GOTO :eof

:usage
ECHO FooBar
ECHO Usage: foobar ^<command^> [--foo [^<fooval^>]] [--bar ^<barval^>] [--baz]
EXIT /B 1

예, 정말 나쁩니다. https://stackoverflow.com/a/50653047/421049 에서 비슷한 게시물을 참조하십시오. . 여기서 논리에서 진행중인 작업과 특정 구문을 사용한 이유에 대한 자세한 분석을 제공합니다.

끔찍한. 그 중 대부분은 오늘 배워야했습니다. 그리고 그것은 아프다.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.