What is the proper way to test if a parameter is empty in a batch file? What is the proper way to test if a parameter is empty in a batch file? windows windows

What is the proper way to test if a parameter is empty in a batch file?


Use square brackets instead of quotation marks:

IF [%1] == [] GOTO MyLabel

Parentheses are insecure: only use square brackets.


You can use:

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

to strip the outer set of quotes. In general, this is a more reliable method than using square brackets because it will work even if the variable has spaces in it.


One of the best semi solutions is to copy %1 into a variable and then use delayed expansion, as delayedExp. is always safe against any content.

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

The advantage of this is that dealing with param1 is absolutly safe.

And the setting of param1 will work in many cases, like

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

But it still fails with strange contents like

test.bat ^&"&

To be able to get a 100% correct answer for the existence

It detects if %1 is empty, but for some content it can't fetch the content.
This can be also be useful to distinguish between an empty %1 and one with "".
It uses the ability of the CALL command to fail without aborting the batch file.

@echo offsetlocal EnableDelayedExpansionset "arg1="call set "arg1=%%1"if defined arg1 goto :arg_existsset "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 missingexit /b:arg_existsecho arg1 exists, perhaps the content is '!arg1!'

If you want to be 100% bullet proof to fetch the content, you could read How to receive even the strangest command line parameters?