La respuesta corta: use corchetes:
if [%1]==[] goto :blank
o (cuando necesite manejar argumentos entre comillas, consulte la Edición a continuación):
if [%~1]==[] goto :blank
¿Por qué? podría preguntar. Bueno, tal como lo mencionó Jeremiah Willcock: http://ss64.com/nt/if.html - ¡ellos usan eso! Bien, pero ¿qué pasa con las comillas?
Nuevamente, respuesta corta: son "mágicos" - a veces las comillas dobles (dobles) se convierten en una comilla simple (doble). Y necesitan coincidir, para empezar.
Considere este pequeño guión:
@rem argq.bat
@echo off
:loop
if "%1"=="" goto :done
echo %1
shift
goto :loop
:done
echo Done.
Vamos a probarlo:
C:\> argq bla bla
bla
bla
Done.
Parece funcionar. Pero ahora, cambiemos a la segunda marcha:
C:\> argq "bla bla"
bla""=="" was unexpected at this time.
Boom Esto no se evaluó como verdadero, ni tampoco como falso. El guión MURIÓ. Si se suponía que debías apagar el reactor en algún momento, bueno, mala suerte. Ahora morirás como Harry Daghlian.
Puede pensar: está bien, los argumentos no pueden contener comillas. Si lo hacen, esto sucede.Incorrecto Aquí hay un consuelo:
C:\> argq ""bla bla""
""bla
bla""
Done.
Oh si. No te preocupes a veces esto va a funcionar.
Probemos con otro script:
@rem args.bat
@echo off
:loop
if [%1]==[] goto :done
echo %1
shift
goto :loop
:done
echo Done.
Puede probar usted mismo que funciona bien para los casos anteriores. Esto es lógico: las comillas no tienen nada que ver con los corchetes, por lo que no hay magia aquí. Pero, ¿qué hay de condimentar los argumentos con corchetes?
D:\>args ]bla bla[
]bla
bla[
Done.
D:\>args [bla bla]
[bla
bla]
Done.
No hubo suerte ahí. Los corchetes simplemente no pueden bloquear cmd.exe
el analizador.
Volvamos a las citas malvadas por un momento. El problema estaba ahí, cuando la discusión terminó con una cita:
D:\>argq "bla1 bla2"
bla2""=="" was unexpected at this time.
¿Qué pasa si paso solo:
D:\>argq bla2"
The syntax of the command is incorrect.
El script no se ejecutará en absoluto. Lo mismo para args.bat
:
D:\>args bla2"
The syntax of the command is incorrect.
Pero, ¿qué obtengo, cuando el número de "
caracteres "coincide" (es decir, es par), en tal caso:
D:\>args bla2" "bla3
bla2" "bla3
Done.
NICE - Espero que hayas aprendido algo sobre cómo.bat
archivos dividen sus argumentos de línea de comando (SUGERENCIA: * No es exactamente como en bash). El argumento anterior contiene un espacio. Pero las citas no se eliminan automáticamente.
¿Y argq? ¿Cómo reacciona ante eso? Como era de esperar:
D:\>argq bla2" "bla3
"bla3"=="" was unexpected at this time.
Entonces, piense antes de decir: "¿Sabes qué? Solo usa comillas. [Porque, para mí, esto se ve mejor]".
Editar
Recientemente, hubo comentarios sobre esta respuesta; bueno, los corchetes sqare "no pueden manejar" pasar argumentos entre comillas y tratarlos como si no estuvieran citados.
La sintaxis:
if "%~1"=="" (...)
No es una virtud recién descubierta de las comillas dobles, sino una muestra de una característica clara de eliminar las comillas de la variable argumento, si el primer y último carácter es una comilla doble.
Esta "tecnología" funciona igual de bien con corchetes:
if [%~1]==[] (...)
Fue útil señalar esto, así que también voté a favor de la nueva respuesta.
Finalmente, fanáticos de las comillas dobles, ¿existe un argumento de la forma ""
en su libro o está en blanco? Solo preguntaba' ;)
GOTO BLANK
línea) a las otras dosIF
declaraciones, ¿eso soluciona el problema?