2011-02-10 29 views
72

Mi sistema operativo es Windows Vista. Necesito tener un archivo ".bat" donde necesito verificar si el usuario ingresa algún parámetro en la línea de comando o no. Si lo hace, entonces si el parámetro es igual a -b entonces haré algo de lo contrario marcaré "Entrada inválida". Si el usuario no ingresa ningún parámetro en la línea de comando, entonces haré algo. He creado el siguiente archivo .bat. Funciona para -b y no equivale a -b casos, pero falla cuando el usuario no pasa ningún parámetro de línea de comandos.¿Cómo comprobar el parámetro de la línea de comando en el archivo ".bat"?

siempre me sale error:

GOTO was unexpected at this time. 

Puede alguien 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! 
+0

Si agrega corchetes (como en la línea 'GOTO EN BLANCO') a las otras dos declaraciones' IF', ¿soluciona esto el problema? –

Respuesta

89

Es necesario comprobar para el parámetro está en blanco: if "%~1"=="" goto blank

Una vez que hayas hecho esto, y luego hacer una si el interruptor/persona en -b: if "%~1"=="-b" (goto specific) else goto unknown

Alrededor de la los parámetros con comillas facilitan la comprobación de elementos como los parámetros en blanco/vacío/faltante. "~" asegura que las comillas dobles se eliminen si estuvieran en el argumento de línea de comando.

+0

¡Esto funciona! Solo "else" no es aceptado. Recibo un error: 'else' no se reconoce como un comando interno o externo, programa operable o archivo por lotes. Así que agregué otro IF para el caso "no igual a -b". Gracias por la rápida respuesta. – javauser71

+5

El ELSE tiene que estar en la misma línea que el IF, o tiene que estar directamente después de un corchete – jeb

+4

Esto no parece funcionar para mí si% 1 contiene espacios, que puede ser el caso si es la ruta completa a un ejecutable Ver [respuesta de Jeremiah Willcock] (http://stackoverflow.com/a/4953226/1840078) para obtener una solución que funcione incluso para parámetros con espacios en sus valores. –

23

Mire http://ss64.com/nt/if.html para una respuesta; el comando es IF [%1]==[] GOTO NO_ARGUMENT o similar.

+0

Sí, esto también funciona. Gracias por la rápida respuesta. – javauser71

+1

¡Esto no solo funciona! Simplemente funciona, en contraste con '"% 1 "==" "'. Debo profundizar en eso en mi propia respuesta. –

+1

esto se romperá cuando se cotice% 1, p. 'foo.bat" primer parámetro "2nd_param'. Ver https: // stackoverflow.com/questions/2541767/what-is-the-proper-way-to-test-if-variable-is-empty-in-a-batch-file –

4

Está buscando una combinación de cuerdas. Si se omiten los argumentos, %1 se expande a un espacio en blanco por lo que los comandos se convierten en IF =="-b" GOTO SPECIFIC por ejemplo (que es un error de sintaxis). Envuelve tus cadenas entre comillas (o corchetes).

REM this is ok 
IF [%1]==[/?] GOTO BLANK 

REM I'd recommend using quotes exclusively 
IF "%1"=="-b" GOTO SPECIFIC 

IF NOT "%1"=="-b" GOTO UNKNOWN 
+0

IF [% 1] == [/?] No funciona, pero sí lo hago SI [% 1] == [] o "% 1" == "", entonces funciona De todos modos ahora puedo irme. Gracias por su rápida respuesta. – javauser71

6

Además de las otras respuestas, que suscribo, es posible considerar el uso del interruptor de /I del comando IF.

... the /I switch, if specified, says to do case insensitive string compares.

puede ser útil si desea dar flexibilidad insensible a las mayúsculas y minúsculas a sus usuarios para especificar los parámetros.

IF /I "%1"=="-b" GOTO SPECIFIC 
7

La respuesta corta - uso de corchetes:

if [%1]==[] goto :blank 

o (cuando se necesita para manejar argumentos citados, véase la edición más adelante):

if [%~1]==[] goto :blank 

¿Por qué? puedes preguntar Bueno, tal como lo mencionó Jeremiah Willcock: http://ss64.com/nt/if.html - ¡lo usan! OK, pero ¿qué pasa con las comillas?

De nuevo, respuesta breve: son "mágicos", a veces las comillas dobles (dobles) se convierten en una sola (doble) comilla. Y tienen que coincidir, para empezar.

consideran este pequeño script:

@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, vamos a pasar a la segunda marcha:

C:\> argq "bla bla" 
bla""=="" was unexpected at this time. 

Boom Esto no evaluó a verdadero, tampoco se evalúa como falsa. El script MURIÓ. Si se suponía que debías apagar el reactor en algún momento, buena suerte. Ahora morirás como Harry Daghlian.

Puede pensar, de acuerdo, los argumentos no pueden contener comillas. Si lo hacen, esto sucede. incorrecto Aquí hay un consuelo:

C:\> argq ""bla bla"" 
""bla 
bla"" 
Done. 

Oh sí. No se preocupe - veces esto trabajo.

Probemos otro guión:

@rem args.bat 
@echo off 

:loop 
if [%1]==[] goto :done 
echo %1 
shift 
goto :loop 

:done 
echo Done. 

usted puede probarse, que funciona bien para los casos anteriores. Esto es lógico: las citas no tienen nada que ver con los corchetes, así que no hay magia aquí. Pero, ¿qué tal condimentar los args con corchetes?

D:\>args ]bla bla[ 
]bla 
bla[ 
Done. 

D:\>args [bla bla] 
[bla 
bla] 
Done. 

No hubo suerte allí. Los corchetes simplemente no pueden ahogar el analizador cmd.exe.

Volvamos a las citas malvadas por un momento. El problema era que, cuando la discusión terminó con una cita:

D:\>argq "bla1 bla2" 
bla2""=="" was unexpected at this time. 

Lo que si me pasa justo:

D:\>argq bla2" 
The syntax of the command is incorrect. 

El script no funcionará en absoluto. Lo mismo para args.bat:

D:\>args bla2" 
The syntax of the command is incorrect. 

Pero lo hago para que, cuando el número de " -Los personajes "coincidencias" (es decir, - que es aún), en tal caso:

D:\>args bla2" "bla3 
bla2" "bla3 
Done. 

AGRADABLE - Espero que hayas aprendido algo sobre cómo los archivos .bat dividen sus argumentos en la línea de comando (AVISO: * No es exactamente como en bash). El argumento anterior contiene un espacio. Pero las cotizaciones no se eliminan automáticamente.

¿Y argq? ¿Cómo reacciona a eso? Como era de esperar:

D:\>argq bla2" "bla3 
"bla3"=="" was unexpected at this time. 

Por lo tanto - piensa antes de decir: "?. Sepa lo que sólo requiere comillas [Porque, para mí, esto parece más agradable]".

Editar

Recientemente, hubo comentarios acerca de esta respuesta - así, soportes sqare "no pueden manejar" el paso de argumentos citados y tratarlos como si ellos no fueron citados.

La sintaxis:

if "%~1"=="" (...) 

No hay algún recién descubierto virtud de las comillas dobles, pero una muestra de una característica interesante de despojar a las cotizaciones de la variable argumento, si el primer y último carácter es un doble cotización .

Esta "tecnología" funciona igual de bien con corchetes:

if [%~1]==[] (...) 

que era una cosa útil para señalar esto, así que también Upvote la nueva respuesta.

Por último, comillas dobles, ¿existe un argumento del formulario "" en su libro, o está en blanco? Sólo preguntando;)

+1

Los corchetes '[% 1] == [- b]' no coincidirán si arg se cita como 'run.bat" -b "'. Consulte https://stackoverflow.com/a/46942471 – wisbucky

+0

Nota histórica: '[% 1] == [- b]' y '"% 1 "==" - b "' eran los mismos para win 98 y MS anterior/Guiones por lotes de sistemas PC-DOS. Desde win 2000/NT introdujo la sintaxis 'if"% ~ 1 "==" - b "' donde las comillas dobles tienen un significado especial que es la forma en que debe codificar las secuencias de comandos, ya que proporciona una protección más robusta. Las comillas dobles escapan al significado de caracteres especiales (prueba & | y% caracteres en tu línea de comandos). El 99.9% de los ejemplos funcionan con sintaxis de comillas dobles; su ejemplo 'argq bla2 '' bla3' es solo un caso para justificar corchetes. Las comillas dobles incrustadas son una receta para el desastre, simplemente diciendo ' –

+0

@SkipR: por eso en los sistemas de archivos de Windows, no puede tener estos caracteres especiales en los nombres. No tengo una prueba matemática, pero creo que simplemente NO se puede citar todo (en el sentido de - hecho al pie de la letra por alguna secuencia de escape, etc.) en el shell 'cmd'. En otros sistemas, a veces se puede citar todo, incluido el carácter NUL. (https://stackoverflow.com/questions/2730732/how-can-i-write-a-null-ascii-character-nul-to-a-file-with-a-windows-batch-scri#2769141) - esta pregunta solo muestra, necesita usar algún programa externo. –

2

En realidad, todas las otras respuestas tienen defectos. La forma más fiable es:

IF "%~1"=="-b" (GOTO SPECIFIC) ELSE (GOTO UNKNOWN) 

Explicación detallada:

Usando "%1"=="-b" va a toda máquina accidente si se pasa el argumento con espacios y citas. Este es el método menos confiable.

IF "%1"=="-b" (GOTO SPECIFIC) ELSE (GOTO UNKNOWN) 

C:\> run.bat "a b" 

b""=="-b" was unexpected at this time. 

Usando [%1]==[-b] es mejor porque no va a chocar con espacios y citas, pero no coincidirá si el argumento está rodeado por comillas.

IF [%1]==[-b] (GOTO SPECIFIC) ELSE (GOTO UNKNOWN) 

C:\> run.bat "-b" 

(does not match, and jumps to UNKNOWN instead of SPECIFIC) 

El uso de "%~1"=="-b" es el más confiable. %~1 se despojará de las cotizaciones que rodean si existen. Entonces funciona con y sin comillas, y también sin argumentos.

IF "%~1"=="-b" (GOTO SPECIFIC) ELSE (GOTO UNKNOWN) 

C:\> run.bat 
C:\> run.bat -b 
C:\> run.bat "-b" 
C:\> run.bat "a b" 

(all of the above tests work correctly) 
+0

Este no es el final de los corchetes, verá: 'IF [% ~ 1] == []' - esto funciona, e incluso maneja '" -b "'. Solo necesita poder pensar * dentro * de la caja, erm, cuadrado [corchetes]. –

Cuestiones relacionadas