¿Cuál es la forma correcta de probar si un parámetro está vacío en un archivo por lotes?

Resuelto blak3r asked hace 14 años • 18 respuestas

Necesito probar si una variable está configurada o no. Probé varias técnicas, pero parecen fallar cuando %1está entre comillas, como en el caso de que %1sea "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 IFtipos 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é.

blak3r avatar Mar 30 '10 05:03 blak3r
Aceptado

Utilice corchetes en lugar de comillas:

IF [%1] == [] GOTO MyLabel

Los paréntesis son inseguros : utilice únicamente corchetes.

Dan Story avatar Mar 29 '2010 22:03 Dan Story

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.

jamesdlin avatar Mar 30 '2010 10:03 jamesdlin

Una de las mejores semisoluciones es copiar %1en 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 %1está vacío, pero para algunos contenidos no puede recuperarlos.
Esto también puede resultar útil para distinguir entre un vacío %1y uno con "".
Utiliza la capacidad del CALLcomando 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?

jeb avatar Dec 09 '2011 22:12 jeb

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.

Andy Morris avatar Mar 30 '2010 12:03 Andy Morris