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.
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 EnableDelayedExpansion
if "!param1!"=="" ( echo it is empty )
rem ... or use the DEFINED keyword now
if 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"test
test.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 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!'
If you want to be 100% bullet proof to fetch the content, you could read How to receive even the strangest command line parameters?
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.