Windows에서 배치 파일이 실행될 때 전달 된 인수에 어떻게 액세스합니까?
예를 들어라는 프로그램이 있다고 가정 해 봅시다 hello.bat
. hello -a
Windows 명령 행에 입력 할 때 -a
인수로 전달 된 프로그램을 프로그램에 알리 려면 어떻게해야합니까?
답변
이미 다른 사람이 말했듯이, 명령 줄을 통해 전달 된 매개 변수는 표기법 배치 파일에 액세스 할 수 있습니다 %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 /?
명령 프롬프트 에 입력하여 이러한 기능의 전체 범위를 볼 수 있습니다 .
답변
배치 파일에서 매개 변수 사용 : % 0 및 % 9
배치 파일은 토큰 : %0
to 로 매개 변수로 전달 된 단어를 참조 할 수 있습니다 %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
답변
배치 파일은 할당 할 변수 인 경우 프로그램 뒤에 자동으로 텍스트를 전달합니다. 그들은 전송 된 순서대로 전달됩니다. 예를 들어 % 1은 프로그램이 호출 된 후 전송 된 첫 번째 문자열입니다.
Hello.bat가 있고 내용이 다음과 같은 경우
@echo off
echo.Hello, %1 thanks for running this batch file (%2)
pause
그리고 당신은 통해 배치 명령을 호출
hello.bat APerson241 % date %
이 메시지를 다시 받아야합니다.
안녕하세요, APerson241이 배치 파일을 실행 해 주셔서 감사합니다 (2013 년 1 월 11 일)
답변
@ 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 에서 비슷한 게시물을 참조하십시오. . 여기서 논리에서 진행중인 작업과 특정 구문을 사용한 이유에 대한 자세한 분석을 제공합니다.
끔찍한. 그 중 대부분은 오늘 배워야했습니다. 그리고 그것은 아프다.
답변
사용 변수는 즉, .BAT
변수 및 호출 %0
에%9