2011-04-16 9 views
55

Estoy haciendo un archivo por lotes simple que requiere un argumento (puede proporcionar más, pero los ignoro).Windows Batch Files: if else

Para probar, esto es lo que tengo hasta ahora.

if not %1 == "" (
    dir /s/b %1 
) else (
    echo no 
) 

Básicamente, quiero decir si se proporciona un argumento, de forma recursiva mostrar todos los archivos en la carpeta. De lo contrario, di no.

Funciona cuando proporciono un argumento, pero si no proporciono uno solo me dirá (was unexpected at this time.

Quiero decir, funciona, pero al menos quería mostrar un mensaje fácil de usar explicando por qué no funciona. ¿Cómo debería cambiar el código?

Respuesta

64
if not %1 == "" (

debe haber

if not "%1" == "" (

Si no se le da un argumento, es completamente vacío, ni siquiera "" (que representa una cadena vacía en la mayoría de los lenguajes de programación). Entonces usamos las comillas circundantes para detectar un argumento vacío.

+1

Por lo tanto, es básicamente un valor nulo. Lo entiendo. – MxyL

+1

si no es {% 1} == {} es más seguro ya que "% 1" == "" sería verdadero si el valor de% 1 fuera comillas. – workabyte

+2

@workabyte: Usar llaves como sugeriría podría ser más confuso cuando '% 1' se refiere a una ruta o archivo, porque a diferencia de los caracteres de corchete' {'y'} ', las comillas dobles' "' nunca pueden aparecer en ningún La ruta o el nombre de archivo de Windows. Por lo tanto, es posible que evite intentar descifrar las cosas que se resuelven en '{}}}} == {}'. Tal vez de manera más realista, tenga en cuenta que '{{ea14c59a-889c-495b-8bb6-be78cf960e93} .txt} == {{ea14c59a-889c-495b-8bb6-be78cf960e93.txt}} ', por ejemplo, es falso. –

19

Rodee su %1 con algo.

Ej:

if not "%1" == "" 

Otra que he visto con bastante frecuencia:

if not {%1} == {} 

Y así sucesivamente ...

El problema, como es probable que pueda imaginar, es que el %1 es literalmente reemplazado por vacío. No es 'una cadena vacía', es en realidad un punto en blanco en su archivo fuente en ese punto.

Luego, después del reemplazo, el intérprete intenta analizar la declaración if y se confunde.

8

Otro consejo relacionado es usar "% ~ 1" en lugar de "% 1". Escriba "CALL /?" en la línea de comando en Windows para obtener más detalles.

+2

'% ~ 1 - expande% 1 eliminando las comillas circundantes (")' para que nadie más tenga buscarlo – Noumenon

9

que tiene que hacer lo siguiente:

if "%1" == "" (
    echo The variable is empty 
) ELSE (
    echo The variable contains %1 
) 
+1

La parte importante aquí es que el ELSE debe estar en la misma línea que el paréntesis de cierre para la instrucción IF; de lo contrario, obtendrá un error. – rook

1

que tiene que hacer así ...

si no "a% 1" == "A"

si la entrada argumento% 1 es nulo, su código tendrá un problema.

4

Una alternativa sería la de establecer una variable, y comprobar si se define:

SET ARG=%1 
IF DEFINED ARG (echo "It is defined: %1") ELSE (echo "%%1 is not defined") 

Desafortunadamente, el uso %1 directamente con DEFINED no funciona.