Estoy tratando de usar la siguiente lógica de validación en un archivo por lotes, pero el bloque "uso" nunca se ejecuta incluso cuando no se proporciona ningún parámetro al archivo por lotes.
if ("%1"=="") goto usage
@echo This should not execute
@echo Done.
goto :eof
:usage
@echo Usage: %0 <EnvironmentName>
exit 1
¿Qué estoy haciendo mal?
batch-file
arguments
Daniel Fortunov
fuente
fuente
Respuestas:
La verificación de si se ha establecido un argumento de línea de comandos puede ser
[%1]==[]
, pero, como señala Dave Costa , también funcionará."%1"==""
También solucioné un error de sintaxis en el eco de uso para escapar de los signos mayor que y menor que. Además, la
exit
necesidad de un/B
argumento de lo contrario seCMD.exe
cerrará.fuente
set
variables (no sé la terminología de lote correcta), es posible que desee usar"%myvar%"==""
porque simyvar
tiene espacios y no está entre comillas, obtendrá el "inesperado en este momento "mensaje.IF NOT DEFINED VarName
block. También +1 a tukushan por no usar comillas en comparación. Simplemente no lo hagas. Nunca."%~1"==""
también funcionará y se ocupará del caso en el que% 1 tenga comillas dobles"%~1"==""
maneja espacios en la variable mientras que la[]
versión no.✨ otras cosas..✨
■ en
%~1
:~
elimina cualquier envoltorio"
o'
.■ in
%~s1
- thes
hace que la ruta seaDOS 8.3 naming
, lo cual es un buen truco para evitar espacios en el nombre de archivo mientras verifica cosas (y de esta manera no es necesario envolver el recurso con más"
s.■ el
["%~1"]==[""]
"no puedo estar seguro" si el argumento es un archivo / directorio o simplemente una cadena genérica todavía, por lo que en su lugar la expresión usa corchetes y el original sin modificar%1
(solo sin el"
ajuste, si lo hay ..)si no hubo argumentos de si lo hemos usado
shift
y el puntero de lista de argumentos ha pasado el último, la expresión se evaluará como[""]==[""]
.■ esto es lo más específico que puede ser sin usar más trucos (funcionaría incluso en los scripts por lotes de Windows-95 ...)
■ ejemplos de ejecución
guárdalo como
identifier.cmd
puede identificar un número ilimitado de argumentos (normalmente está limitado a
%1
-%9
), solo recuerde envolver los argumentos con comas invertidas, o use la denominación 8.3, o arrástrelos y suéltelos (automáticamente hace cualquiera de los anteriores).esto le permite ejecutar los siguientes comandos:
⓵
identifier.cmd c:\windows
y para conseguir⓶
identifier.cmd "c:\Program Files (x86)\Microsoft Office\OFFICE11\WINWORD.EXE"
y para conseguir⓷ y múltiples argumentos (por supuesto, este es el problema ..)
identifier.cmd c:\windows\system32 c:\hiberfil.sys "c:\pagefile.sys" hello-world
y conseguir
naturalmente, puede ser mucho más complejo, pero los buenos ejemplos siempre deben ser simples y mínimos. :)
Espero que ayude a alguien :)
publicado aquí: CMD Ninja - Procesamiento ilimitado de argumentos, identificación de si existe en el sistema de archivos, identificación de archivo o directorio
y aquí hay un ejemplo de trabajo que toma cualquier cantidad de archivos APK (aplicaciones de Android) y los instala en su dispositivo a través de la consola de depuración (ADB.exe): Haga de la publicación anterior un instalador masivo de APK que no use ADB Install-Multi Syntax
fuente
Deshazte de los paréntesis.
Archivo por lotes de muestra:
Resultado de ejecutar el script anterior:
Creo que en realidad está tomando los paréntesis para ser parte de las cadenas y se están comparando.
fuente
if "%1"==""
se bloqueará si el argumento tiene espacios. Por ejemplo:run.bat "a b"
. @amr tiene la mejor respuesta para usarif "%~1"==""
~ eliminará% 1 si se cita% 1.
"" protegerá de los caracteres especiales pasados. por ejemplo llamando al script con & ping
fuente
run.bat "a b"
run.bat ""
no será atrapado por[%1]==[]
.fuente
run.bat "a b"
Esto es lo mismo que las otras respuestas, pero usa solo una etiqueta y pone el uso primero, lo que además hace que sirva como una especie de recomendación de documentación del script que generalmente también se coloca en la parte superior:
Sin embargo, si no tiene que usar cmd / batch, use bash en WSL o powershell, tienen una sintaxis más sana y menos características arcanas.
fuente
SI "% 1" == "" fallará, todas las versiones fallarán bajo ciertas condiciones de carácter venenoso. Solo SI ESTÁ DEFINIDO o NO ESTÁ DEFINIDO son seguros
fuente
if [not] defined ...
no funciona con parámetros como%1
. ¿Tiene un ejemplo, dóndeif "%~1" ...
no funciona?