¿Cuál es la forma correcta de probar si un parámetro está vacío en un archivo por lotes?
Necesito probar si una variable está configurada o no. Probé varias técnicas, pero parecen fallar cuando %1
está entre comillas, como en el caso de que %1
sea "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.
Según este sitio , estos son los IF
tipos de sintaxis admitidos. Entonces no veo la manera de hacerlo.
IF [NOT] ERRORLEVEL number command
IF [NOT] string1==string2 command
IF [NOT] EXIST filename command
ACTUALIZACIÓN: el 25 de octubre de 2020, actualicé la respuesta aceptada del uso de corchetes al uso de tilde. Todo el mundo dice que la tilde es mejor porque es más segura. Estoy un poco desgarrado porque la tilde parece más complicada y no está tan claro cuál es su propósito, pero aun así la cambié.
Utilice corchetes en lugar de comillas:
IF [%1] == [] GOTO MyLabel
Los paréntesis son inseguros : utilice únicamente corchetes.
Puedes usar:
IF "%~1" == "" GOTO MyLabel
para eliminar el conjunto exterior de comillas. En general, este es un método más confiable que usar corchetes porque funcionará incluso si la variable tiene espacios.
Una de las mejores semisoluciones es copiar %1
en una variable y luego usar expansión retardada, como retardadaExp. siempre está a salvo de cualquier contenido.
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
La ventaja de esto es que tratar con param1 es absolutamente seguro.
Y la configuración de param1 funcionará en muchos casos, como
test.bat hello"this is"a"test
test.bat you^&me
Pero todavía falla con contenidos extraños como
test.bat ^&"&
Para poder obtener una respuesta 100% correcta para la existencia.
Detecta si %1
está vacío, pero para algunos contenidos no puede recuperarlos.
Esto también puede resultar útil para distinguir entre un vacío %1
y uno con ""
.
Utiliza la capacidad del CALL
comando para fallar sin abortar el archivo por lotes.
@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!'
Si desea ser 100% a prueba de balas para recuperar el contenido, puede leer ¿ Cómo recibir incluso los parámetros de línea de comando más extraños?
De SI /?:
Si las extensiones de comando están habilitadas, IF cambia de la siguiente manera:
IF [/I] string1 compare-op string2 command IF CMDEXTVERSION number command IF DEFINED variable command
......
El condicional DEFINED funciona igual que EXISTS, excepto que toma un nombre de variable de entorno y devuelve verdadero si la variable de entorno está definida.