Necesito probar si una variable está configurada o no. He intentado varias técnicas, pero parecen fallar siempre que %1
está rodeado de comillas, como el caso cuando %1
es así "c:\some path with spaces"
.
IF NOT %1 GOTO MyLabel // This is invalid syntax
IF "%1" == "" GOTO MyLabel // Works unless %1 has double quotes which fatally kills bat execution
IF %1 == GOTO MyLabel // Gives an unexpected GOTO error.
Según este sitio , estos son los IF
tipos de sintaxis compatibles . Entonces, no veo una manera de hacerlo.
IF [NOT] ERRORLEVEL number command
IF [NOT] string1==string2 command
IF [NOT] EXIST filename command
windows
shell
batch-file
cmd
blak3r
fuente
fuente
if "%1" == "" GOTO MyLabel
no mata fatalmente la ejecución del script siempre que%1
tenga un número par de comillas dobles. Veo que un número impar de comillas dobles%1
mata la ejecución del script con este error:The syntax of the command is incorrect.
la siguiente solución que utiliza corchetes para resolver el problema se ha marcado como la respuesta correcta, pero no parece estar mejorando. . Esa solución también falla con el mismo error cuando%1
tiene un número impar de comillas dobles.IF DEFINED
solo trabajar en variables de entorno en lugar de variables de script es una pérdida de potencial!Respuestas:
Use corchetes en lugar de comillas:
Los paréntesis son inseguros : solo use corchetes.
fuente
&
en%1
romperá la líneaif #%1#==##
oif [%1]==[]
es bueno siempre que no haya espacios en el argumento, de lo contrario obtendrá un…was unexpected at this time
error."%~1"
es realmente un mejor enfoque, como mencioné en mi respuesta.==
. Use su respuesta en su lugar.it DOES NOT work with spaces
. Utilice la respuesta @jamesdlin en su lugar.Puedes usar:
para quitar el conjunto exterior de comillas. En general, este es un método más confiable que el uso de corchetes porque funcionará incluso si la variable tiene espacios.
fuente
~
, elimina las comillas externas si están presentes, pero luego las agrega de nuevo manualmente (asegurando solo un conjunto). Por otra parte, usted tiene que usar comillas si el argumento contiene espacios (I aprendido de la manera difícil cuando mi versión anterior de utilizar#
o corchetes en lugar de cotizaciones causó argumentos con espacios para lanzar un…was unexpected at this time
error.)""this string will crash the comparison""
doble '"' es la secuencia de escape adecuada y la sustitución en doble '"' fallará si el cadena está vacía."%~1"
.Una de las mejores soluciones semi es copiar
%1
en una variable y luego usar expansión demorada, como delayedExp. siempre es seguro contra cualquier contenido.La ventaja de esto es que tratar con param1 es absolutamente seguro.
Y la configuración de param1 funcionará en muchos casos, como
Pero todavía falla con contenidos extraños como
Para poder obtener una respuesta 100% correcta para la existencia
Detecta si
%1
está vacío, pero para algunos contenidos no puede recuperar el contenido.Esto también puede ser útil para distinguir entre un vacío
%1
y uno con""
.Utiliza la capacidad del
CALL
comando para fallar sin abortar el archivo por lotes.Si desea ser 100% a prueba de balas para obtener el contenido, puede leer ¿Cómo recibir incluso los parámetros de línea de comando más extraños?
fuente
De IF / ?:
fuente
%1
y los gustos. Las "variables definidas dentro del archivo por lotes" en realidad son variables de entorno mientras se ejecuta el archivo por lotes, y puede usarlasIF DEFINED
.Desafortunadamente no tengo suficiente reputación para comentar o votar sobre las respuestas actuales a las que he tenido que escribir las mías.
Originalmente, la pregunta del OP decía "variable" en lugar de "parámetro", lo cual se volvió muy confuso, especialmente porque este era el enlace número uno en google para buscar cómo probar las variables en blanco. Desde mi respuesta original, Stephan ha editado la pregunta original para usar la terminología correcta, pero en lugar de eliminar mi respuesta, decidí dejarla para ayudar a aclarar cualquier confusión, especialmente en caso de que Google todavía envíe personas aquí para variables también:
¡% 1 NO ES UNA VARABLE! ES UN PARÁMETRO DE LÍNEA DE MANDO.
Muy importante distinción. Un solo signo de porcentaje con un número después de que se refiere a un parámetro de línea de comando, no a una variable.
Las variables se establecen con el comando set y se recuperan con signos de 2 por ciento, uno antes y otro después. Por ejemplo% myvar%
Para probar una variable vacía, use la sintaxis "si no está definida" (los comandos explícitamente para las variables no requieren ningún signo de porcentaje), por ejemplo:
(Si desea probar los parámetros de la línea de comandos, le recomiendo consultar la respuesta de jamesdlin).
fuente
if variable is empty
aif parameter is empty
. Solo lo hice. (a riesgo de invalidar algunas de las respuestas, que verificaron variables en lugar de parámetros y, por lo tanto, no son válidas de todos modos, ya que no respondieron la pregunta)Utilice el "comando variable IF IFIN DEFINED" para probar la variable en el archivo por lotes.
Pero si desea probar los parámetros por lotes, intente con los códigos a continuación para evitar entradas complicadas (como "1 2" o ab ^> cd)
fuente
Pruebo con el siguiente código y está bien.
fuente
IF DEFINED var
por una razónUsualmente uso esto:
Si% 1 está vacío, el IF comparará "." a "." que se evaluará como verdadero.
fuente
Creé este pequeño script por lotes basado en las respuestas aquí, ya que hay muchas válidas. Siéntase libre de agregar a esto siempre que siga el mismo formato:
fuente
La cadena vacía es un par de
double-quotes
/""
, solo podemos probar la longitud:luego prueba que son 2 caracteres contra
double-quotes
:Aquí hay un script por lotes con el que puedes jugar. Creo que atrapa correctamente la cadena vacía.
Este es solo un ejemplo, solo necesita personalizar 2 (¿o 3?) Pasos anteriores de acuerdo con su script.
El resultado de esta prueba de tortura:
fuente
""
una cadena vacía es una cadena vacía `` y en lote una variable vacía es una variable indefinida. Puede definir que para sus argumentos se eliminarán las comillas externas, pero luego la cadena aún está vacía con una longitud de 0""
se usan para cadenas vacías, pero es bastante fácil de usar%~1
para eliminar las comillas externas. no hay necesidad de usar una solución tan compleja"%~1"==""
fallarán con argumentos como"Long File Name".txt
cuál es un argumento válido. editar : Y definitivamente no es complejo como dijiste. Solo 2 pasos anteriores para la prueba, el resto son ejemplos detallados.Puedes usar
fuente
Guión 1:
Entrada ("Quitar Quotes.cmd" "Esta es una prueba")
Salida (No hay ninguno,% 1 NO estaba en blanco, vacío o NULL):
Ejecutar ("Quitar Quotes.cmd") sin ningún parámetro con el script anterior 1
Salida (% 1 está en blanco, vacío o NULL):
Nota: Si establece una variable dentro de una
IF ( ) ELSE ( )
instrucción, no estará disponible para DEFINIR hasta después de que salga de la instrucción "SI" (a menos que esté habilitada la "Expansión de variable retrasada"; una vez habilitada, use un signo de exclamación "!" En lugar de símbolo de porcentaje "%"}.Por ejemplo:
Guión 2:
Entrada ("Quitar Quotes.cmd" "Esta es una prueba")
Salida:
Nota: También eliminará las comillas del interior de la cadena.
Por ejemplo (usando el script 1 o 2): C: \ Users \ Test \ Documents \ Batch Files> "Remove Quotes.cmd" "Esto es" una "prueba"
Salida (Script 2):
Ejecute ("Eliminar Quotes.cmd") sin ningún parámetro en el Script 2:
Salida:
fuente
Para resumir las cosas:
Este código generará "Cadena vacía" si% 1 es "" o "o está vacío. Se agregó a la respuesta aceptada que actualmente es incorrecta.
fuente
He tenido muchos problemas con muchas respuestas en la red. La mayoría funciona para la mayoría de las cosas, pero siempre hay un caso de esquina que rompe cada uno.
Tal vez no funcione si tiene comillas, tal vez se rompa si no tiene comillas, error de sintaxis si la var tiene un espacio, algunas solo funcionarán en parámetros (a diferencia de las variables de entorno), otras técnicas permiten un vacío un conjunto de citas para pasar como 'definido', y algunas más complicadas no le permitirán encadenar un
else
después.Aquí hay una solución con la que estoy satisfecho, avíseme si encuentra un caso de esquina para el que no funcionará.
Tener esa subrutina, ya sea en su script, o en su propio
.bat
, debería funcionar.Entonces, si quisieras escribir (en pseudo):
Puedes escribir:
Funcionó para todas mis pruebas:
Echo'd
n
,y
,n
,y
,y
Más ejemplos:
if
?Call :ifSet %var% && Echo set
Call :ifSet %var% || Echo set
Call :ifSet %1 && Echo set
ifSet.bat
? No hay problema:((Call ifSet.bat %var%) && Echo set) || (Echo not set)
fuente
(Call ifSet.bat YES && (Echo true & Echo x | findstr y)) || Echo
echostrue
yfalse
ifSet
por su cuenta, luego usandoIf %errorlevel% EQU 0 (x) Else (y)
set
variables (como[%bob%]
, solo funcionaba para argumentos como[%2]
) pero ahora volver a verificarlo funciona. Supongo que mi única queja[]
ahora es que deja pasar las comillas vacías, mientras que esto no lo hará (por lo que depende de su caso de uso, en realidad)/B
bandera detiene la salida de todo el lote, solo sale de la subrutina ocall
'd batch. A menos que esté preguntando qué está haciendo todo el comando ; devuelve un código de error para que el script de llamada conozca el resultado de la subrutina (0
pasar,1
fallar), que se puede usar a través de la lógica booleana en la respuesta o%errorlevel%
en los comentarios anterioresUtilizando ! en lugar de "para comprobar la cadena vacía
fuente
Llegué en menos de un mes (a pesar de que se le preguntó hace 8 años) ... Espero que ahora ya haya superado los archivos por lotes. ;-) Solía hacer esto todo el tiempo. Sin embargo, no estoy seguro de cuál es el objetivo final. Si es flojo como yo, mi go.bat funciona para cosas como esa. (Ver más abajo) Pero, 1, el comando en el OP podría ser inválido si está utilizando directamente la entrada como un comando. es decir,
es un comando no válido (o solía serlo si estuviera en una unidad diferente). Necesitas dividirlo en dos partes.
Y, 2, ¿qué significa 'definido' o 'indefinido'? GIGO Yo uso el valor predeterminado para detectar errores. Si la entrada no queda atrapada, cae para ayudar (o un comando predeterminado). Por lo tanto, ninguna entrada no es un error. Puede intentar cd a la entrada y detectar el error si hay uno. (Ok, el uso de descargas "ir" (solo un par) es capturado por DOS. (¡Duro!))
Y, 3, las comillas se necesitan solo alrededor de la ruta, no el comando. es decir,
estaba mal (o solía hacerlo en los viejos tiempos) a menos que estuvieras en un disco diferente.
Es funcional.
funciona si tienes espacios en tu camino.
fuente
cd
el/d
cambio decd /d "C:\Users\Me" (and the proper path delimeter for Windows is
' : ', no/
).