Mi sistema operativo es Windows Vista. Necesito tener un archivo ".bat" donde necesito verificar si el usuario ingresa algún parámetro de línea de comando o no. Si es así, si el parámetro es igual a, -b
entonces haré algo, de lo contrario, marcaré "Entrada no válida". Si el usuario no ingresa ningún parámetro de línea de comando, haré algo. He creado el siguiente archivo .bat. Funciona para casos -b
y no es igual a ellos -b
, pero falla cuando el usuario no pasa ningún parámetro de línea de comandos.
Siempre obtengo un error:
GOTO was unexpected at this time.
¿Alguien puede decirme qué estoy haciendo mal aquí?
ECHO OFF
CLS
ECHO.
IF [%1]==[/?] GOTO BLANK
IF %1=="-b" GOTO SPECIFIC
IF NOT %1=="-b" GOTO UNKNOWN
:SPECIFIC
ECHO SPECIFIC
GOTO DONE
:BLANK
ECHO No Parameter
GOTO DONE
:UNKNOWN
ECHO Unknown Option
GOTO DONE
:DONE
ECHO Done!
windows
file
batch-file
cmd
javauser71
fuente
fuente
GOTO BLANK
línea) a las otras dosIF
declaraciones, ¿eso soluciona el problema?Respuestas:
Debe verificar que el parámetro esté en blanco:
if "%~1"=="" goto blank
Una vez que hayas hecho eso, haz un interruptor if / else en -b:
if "%~1"=="-b" (goto specific) else goto unknown
Rodear los parámetros con comillas facilita la verificación de cosas como parámetros en blanco / vacíos / faltantes. "~" asegura que las comillas dobles se eliminen si estaban en el argumento de la línea de comandos.
fuente
File
, en ese caso, solo debe marcarexist
onot exist
. Es por eso que sus argumentos deben estar bien definidos, o simplemente usar powershell o vbScript (si está en los años 80 ..)run.bat "a b"
."%1"==""
se bloquea si el argumento tiene un espacio. Ver stackoverflow.com/a/46942471Mire http://ss64.com/nt/if.html para obtener una respuesta; el comando es
IF [%1]==[] GOTO NO_ARGUMENT
o similar.fuente
"%1"==""
. Tengo que desarrollar eso en mi propia respuesta.foo.bat "1st parameter" 2nd_param
. Ver stackoverflow.com/questions/2541767/…[%1]==[-b]
no coincidirá si se cita arg. Ejemplorun.bat "-b"
. Ver stackoverflow.com/a/46942471La respuesta corta: use corchetes:
o (cuando necesite manejar argumentos entre comillas, consulte la Edición a continuación):
¿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:
Vamos a probarlo:
Parece funcionar. Pero ahora, cambiemos a la segunda marcha:
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:
Oh si. No te preocupes a veces esto va a funcionar.
Probemos con otro script:
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?
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:
¿Qué pasa si paso solo:
El script no se ejecutará en absoluto. Lo mismo para
args.bat
:Pero, ¿qué obtengo, cuando el número de
"
caracteres "coincide" (es decir, es par), en tal caso: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:
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:
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:
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' ;)fuente
[%1]==[-b]
no coincidirán si arg se cita comorun.bat "-b"
. Ver stackoverflow.com/a/46942471[%1]==[-b]
y"%1"=="-b"
eran los mismos para win 98 y scripts por lotes de sistemas MS / PC-DOS anteriores. Desde que win 2000 / NT introdujo una sintaxisif "%~1"=="-b"
donde las comillas dobles tienen un significado especial, esa es la forma en que debe codificar los scripts, ya que proporciona una protección más sólida. Las comillas dobles escapan al significado de los caracteres especiales (try & | y% chars en su línea de comando). El 99,9% de los ejemplos funcionan con sintaxis de comillas dobles; su ejemploargq bla2" "bla3
es el único caso para justificar los corchetes. Las comillas dobles incrustadas son una receta para el desastre, solo digocmd
shell. En otros sistemas, a veces se puede citar todo, incluido el carácter NUL. ( stackoverflow.com/questions/2730732/… ): esta pregunta solo muestra que necesita usar algún programa externo.Además de las otras respuestas, que me suscribo, puede considerar usar el
/I
interruptor delIF
comando.puede ser de ayuda si desea dar a sus usuarios una flexibilidad que no distinga entre mayúsculas y minúsculas para especificar los parámetros.
fuente
Estás comparando cadenas. Si se omite un argumento, se
%1
expande a un espacio en blanco para que los comandos se conviertan,IF =="-b" GOTO SPECIFIC
por ejemplo, en un error de sintaxis. Envuelva sus cadenas entre comillas (o corchetes).fuente
En realidad, todas las demás respuestas tienen fallas. La forma más confiable es:
Explicación detallada:
El uso
"%1"=="-b"
se bloqueará por completo si se pasa un argumento con espacios y comillas. Este es el método menos confiable.Usar
[%1]==[-b]
es mejor porque no se bloqueará con espacios y comillas, pero no coincidirá si el argumento está entre comillas.El uso
"%~1"=="-b"
es el más confiable.%~1
eliminará las comillas circundantes si existen. Por lo que funciona con y sin comillas, y también sin argumentos.fuente
IF [%~1]==[]
- esto funciona, e incluso maneja"-b"
. Solo necesita poder pensar dentro del cuadro, eh, cuadrados [corchetes].Recientemente he estado luchando con la implementación de cambios de parámetros complejos en un archivo por lotes, así que aquí está el resultado de mi investigación. Ninguna de las respuestas proporcionadas es completamente segura, ejemplos:
"%1"=="-?"
no coincidirá si el parámetro está entre comillas (necesario para los nombres de archivo, etc.) o se bloqueará si el parámetro está entre comillas y tiene espacios (nuevamente, se ve a menudo en los nombres de archivo)Cualquier combinación con corchetes
[%1]==[-?]
o[%~1]==[-?]
fallará en caso de que el parámetro tenga espacios entre comillas:La solución más segura propuesta
"%~1"=="-?"
se bloqueará con un parámetro complejo que incluye texto fuera de las comillas y texto con espacios dentro de las comillas:La única forma de garantizar que se cubran todos los escenarios anteriores es usar EnableDelayedExpansion y pasar los parámetros por referencia (no por valor) usando variables. Entonces, incluso el escenario más complejo funcionará bien:
fuente
El lote de Windows tiene la palabra clave DEFINED para hacer esto.
fuente