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'' ;)
Mire http://ss64.com/nt/if.html para obtener una respuesta; el comando es IF [%1]==[] GOTO NO_ARGUMENT
o similar.