script run how example create commands batch bat windows file batch-file cmd

run - windows batch file virus



¿Cómo verificar el parámetro de la línea de comando en el archivo ".bat"? (6)

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-igual a -b casos-pero falla cuando el usuario no pasa ningún parámetro de la línea de comando.

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!


Además de las otras respuestas, que suscribo, puede considerar usar el modificador /I del comando IF .

... el interruptor / I, si se especifica, dice que se compare la cadena insensible a mayúsculas y minúsculas.

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


Debe verificar que el parámetro esté en blanco: if "%~1"=="" goto blank

Una vez que haya hecho eso, haga 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 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.


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

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

Explicación detallada:

El uso de "%1"=="-b" se bloqueará si pasa el argumento con espacios y comillas. 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.

Usar [%1]==[-b] es mejor porque no se bloqueará con espacios y comillas, 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)

Usar "%~1"=="-b" es el más confiable. %~1 quitará las comillas circundantes 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)


Estás comparando cadenas. Si se omiten los argumentos, %1 expande a un espacio en blanco para que los comandos se conviertan 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


La respuesta corta: use corchetes:

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

o (cuando necesite manejar args entre comillas, vea la Edición a continuación):

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

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

Nuevamente, respuesta corta: son "mágicos", a veces las comillas dobles (dobles) se convierten a una sola (doble) cita. Y tienen que coincidir, para empezar.

Considera este pequeño guion:

@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 segunda marcha:

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

Boom Esto no se evaluó como verdadero, tampoco se evaluó como falso. 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.

Usted puede pensar: OK, los argumentos no pueden contener comillas. Si lo hacen, esto sucede. Incorrecto Aquí hay algo de consuelo:

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

Oh si. No te preocupes, a veces esto funcionará.

Probemos otro script:

@rem args.bat @echo off :loop if [%1]==[] goto :done echo %1 shift goto :loop :done echo Done.

Puede probarse a sí mismo, 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 hay suerte allí. Los corchetes simplemente no pueden cmd.exe el analizador de cmd.exe .

Volvamos a las citas malvadas por un momento. El problema estaba allí, cuando el argumento 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.

La secuencia de comandos 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 con "(es decir, es par), en tal caso:

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

NICE : 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? Previsiblemente:

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 los argumentos entrecomillados y tratarlos como si no estuvieran citados.

La sintaxis

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

No es una virtud recién descubierta de las comillas dobles, sino una visualización de una característica clara de pelar citas de la variable de argumento, si el primer y el último carácter son comillas dobles.

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

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

Fue útil señalar esto, así que también voté la nueva respuesta.

Finalmente, comillas dobles, ¿existe un argumento de la forma "" en su libro, o está en blanco? Solo preguntaba'' ;)