[windows] 배치 파일에서 매개 변수가 비어 있는지 테스트하는 올바른 방법은 무엇입니까?

변수가 설정되어 있는지 테스트해야합니다. 나는 몇 가지 기술을 시도했지만 그들은 때마다 실패하는 것 %1때와 같은 경우로 따옴표로 둘러싸여 %1있다 "c:\some path with spaces".

IF NOT %1 GOTO MyLabel // This is invalid syntax
IF "%1" == "" GOTO MyLabel // Works unless %1 has double quotes which fatally kills bat execution
IF %1 == GOTO MyLabel // Gives an unexpected GOTO error.

에 따르면 이 사이트 , 이것들은 지원되지 IF구문 유형. 그래서 나는 그것을 할 수있는 방법을 보지 못했습니다.

IF [NOT] ERRORLEVEL number command
IF [NOT] string1==string2 command
IF [NOT] EXIST filename command



답변

따옴표 대신 대괄호를 사용하십시오.

IF [%1] == [] GOTO MyLabel

괄호는 안전하지 않습니다 . 대괄호 만 사용하십시오.


답변

당신이 사용할 수있는:

IF "%~1" == "" GOTO MyLabel

외부 따옴표 세트를 제거합니다. 일반적으로 대괄호를 사용하는 것보다 변수가 공백이 있어도 작동하므로보다 안정적인 방법입니다.


답변

가장 좋은 반 솔루션 중 하나는 %1변수 에 복사 한 다음 delayedExp와 같이 지연 확장을 사용하는 것입니다. 콘텐츠에 대해 항상 안전합니다.

set "param1=%~1"
setlocal EnableDelayedExpansion
if "!param1!"=="" ( echo it is empty )
rem ... or use the DEFINED keyword now
if defined param1 echo There is something

이것의 장점은 param1을 다루는 것이 절대적으로 안전하다는 것입니다.

param1의 설정은 다음과 같은 많은 경우에 작동합니다.

test.bat hello"this is"a"test
test.bat you^&me

그러나 여전히 이상한 내용으로 실패합니다.

test.bat ^&"&

존재에 대한 100 % 정답을 얻을 수 있도록

%1비어 있는지 감지 하지만 일부 콘텐츠의 경우 콘텐츠를 가져올 수 없습니다.
이것은 또한 빈을 구분하는 것이 유용 할 수 있습니다 %1및 하나 "". 배치 파일을 중단하지 않고 명령
의 기능을 사용하여 CALL실패합니다.

@echo off
setlocal EnableDelayedExpansion
set "arg1="
call set "arg1=%%1"

if defined arg1 goto :arg_exists

set "arg1=#"
call set "arg1=%%1"
if "!arg1!" EQU "#" (
    echo arg1 exists, but can't assigned to a variable
    REM Try to fetch it a second time without quotes
    (call set arg1=%%1)
    goto :arg_exists
)

echo arg1 is missing
exit /b

:arg_exists
echo arg1 exists, perhaps the content is '!arg1!'

내용을 가져 오기 위해 100 % 방탄을 원한다면 가장 이상한 명령 줄 매개 변수를받는 방법도 읽을 수 있습니다 .


답변

IF /?에서 :

명령 확장이 활성화 된 경우 IF는 다음과 같이 변경됩니다.

IF [/I] string1 compare-op string2 command
IF CMDEXTVERSION number command
IF DEFINED variable command

……

DEFINED 조건은 환경 변수 이름을 사용하고 환경 변수가 정의 된 경우 true를 리턴한다는 점을 제외하고 EXISTS와 동일하게 작동합니다.


답변

불행히도 나는 내 자신의 글을 써야했던 현재의 답변에 대해 의견을 표하거나 투표 할만한 명성을 얻지 못했습니다.

원래 OP의 질문은 “매개 변수”가 아닌 “변수”라고 말했는데, 이는 매우 혼란 스러웠습니다. 특히 빈 변수를 테스트하는 방법을 검색하는 Google의 가장 큰 링크였습니다. 내 원래 답변 이후 Stephan은 올바른 용어를 사용하도록 원래 질문을 편집했지만 내 답변을 삭제하기보다는 혼란을 없애기 위해 남겨두기로 결정했습니다. 특히 Google이 여전히 사람들을 여기에 변수로 보내고있는 경우에는 특히 그렇습니다.

% 1은 (는) 가치가 없습니다! 명령 줄 매개 변수입니다.

매우 중요한 차이점. 변수가 아닌 명령 행 매개 변수를 참조한 후 숫자가있는 단일 퍼센트 부호.

변수는 set 명령을 사용하여 설정되며 2 % 부호를 사용하여 (이전과 후) 호출됩니다. 예를 들어 % myvar %

빈 변수를 테스트하려면 “정의되지 않은 경우”구문을 사용하십시오 (변수에 대한 명시 적 명령에는 퍼센트 부호가 필요하지 않음).

set myvar1=foo
if not defined myvar1 echo You won't see this because %myvar1% is defined.
if not defined myvar2 echo You will see this because %myvar2% isn't defined.

(명령 줄 매개 변수를 테스트하려면 jamesdlin의 답변을 참조하는 것이 좋습니다.)


답변

배치 파일에서 변수를 테스트하려면 “IF DEFINED 변수 명령”을 사용하십시오.

그러나 배치 매개 변수를 테스트하려면 까다로운 입력을 피하기 위해 아래 코드를 시도하십시오 (예 : “1 2″또는 ab ^> cd)

set tmp="%1"
if "%tmp:"=.%"==".." (
    echo empty
) else (
    echo not empty
)


답변

아래 코드로 테스트하면 괜찮습니다.

@echo off

set varEmpty=
if not "%varEmpty%"=="" (
    echo varEmpty is not empty
) else (
    echo varEmpty is empty
)
set varNotEmpty=hasValue
if not "%varNotEmpty%"=="" (
    echo varNotEmpty is not empty
) else (
    echo varNotEmpty is empty
)