2012-01-06 21 views
18

Digamos que tengo un texto en una variable llamada $ 1. Ahora quiero verificar si ese $ 1 contiene una cierta cadena. Si contiene una cierta cadena, quiero imprimir un mensaje. La impresión no es el problema, el problema es el cheque ... ideas de cómo hacer eso?¿Buscar una cadena para una subcadena en un archivo por lotes (Windows)?

+1

empiece aquí: http://www.dostips.com/DtTipsStringManipulation.php –

+0

¡Gracias! Realmente no ayuda ... Esperaba que haya algo más fácil. ¿Alguna otra idea? – EOB

Respuesta

2

Por lo que sé, cmd.exe no tiene una función incorporada que responda a su pregunta directamente. Pero hace ayuda reemplazar la operación. Entonces el truco es: en tu $ 1 reemplaza la subcadena que necesitas para probar la presencia con una cadena vacía, luego verifica si $ 1 ha cambiado. Si tiene entonces hizo contienen la subcadena (de lo contrario, la operación de reemplazo no tendría nada que reemplazar en primer lugar!). Ver el código de abajo:

set longString=the variable contating (or not containing) some text 

@rem replace xxxxxx with the string you are looking for 
set tempStr=%longString:xxxxxx=% 

if "%longString%"=="%tempStr%" goto notFound 
echo Substring found! 
goto end 

:notFound 
echo Substring not found 

:end 
+1

Nota: este tipo de búsqueda no distingue entre mayúsculas y minúsculas. También puede tener problemas con los caracteres especiales. Es más robusto cuando se utiliza la expansión retrasada tanto para la búsqueda/reemplazo como para la verificación de igualdad. Pero la cadena de búsqueda no puede contener '=' char, y la cadena de búsqueda no puede comenzar con '~' o '*'. – dbenham

+0

@dbenham: observación absolutamente justa, mi solución está lejos de ser perfecta (como es la sintaxis de cmd, sin embargo). –

9

El conjunto de búsqueda y reemplazar truco funciona en muchos casos, pero no soporta caso búsquedas de expresiones regulares o sensibles.

Si necesita una búsqueda sensible a mayúsculas o un soporte limitado de expresiones regulares, puede usar FINDSTR.

Para evitar complicaciones de caracteres especiales que se escapan, es mejor si la cadena de búsqueda está en una variable y se accede tanto a la búsqueda como al objetivo a través de la expansión retardada.

Puede canalizar $ 1 en el comando FINDSTR con el comando ECHO. Use ECHO( en caso de que $ 1 no esté definido, y tenga cuidado de no agregar espacios adicionales. ECHO !$1! hará eco de ECHO is off. (u on) si $ 1 no está definido, mientras que ECHO(!$1! hará eco de una línea en blanco si no está definido.

FINDSTR hará eco de $ 1 si encuentra la cadena de búsqueda; no lo desea, por lo que redirige la salida a nul. FINDSTR establece ERRORLEVEL en 0 si se encuentra la cadena de búsqueda, y 1 si no se encuentra. Eso es lo que se usa para verificar si se encontró la cadena. El && y || es una sintaxis conveniente utilizar para la prueba de partido (ERRORLEVEL 0) o no partido (ERRORLEVEL no 0)

El soporte expresión regular es rudimentaria, pero sigue siendo útil.

See FINDSTR /? para más información.

Este ejemplo de expresión regular buscará $ 1 para "BEGIN" al comienzo de la cadena, "MID" en cualquier parte en el centro, y "END" al final. La búsqueda es sensible a mayúsculas y minúsculas por defecto.

set "search=^BEGIN.*MID.*END$" 
setlocal enableDelayedExpansion 
echo(!$1!|findstr /r /c:"!search!" >nul && (
    echo FOUND 
    rem any commands can go here 
) || (
    echo NOT FOUND 
    rem any commands can go here 
) 
16

La forma más fácil en mi opinión es la siguiente:

set YourString=This is a test 

If NOT "%YourString%"=="%YourString:test=%" (
    echo Yes 
) else (
    echo No 
) 

Basiclly la cadena después de ':' es la cadena que está buscando y que está utilizando no enfrente de la cadena si debido%: * % eliminará * de la cadena, lo que hace que no sean iguales.

+2

Al igual que con [respuesta de Igor] (http://stackoverflow.com/a/8757658/1012053), esta prueba ignora el caso. Además, es más seguro usar expansión retrasada. Finalmente, no se puede usar si la subcadena contiene '='. – dbenham

Cuestiones relacionadas