Archivo por lotes: busque si la subcadena está en una cadena (no en un archivo)

En un archivo por lotes, tengo una cadena abcdefg . Quiero comprobar si bcd está en la cadena.

Desafortunadamente, parece que todas las soluciones que estoy buscando buscan un archivo para una subcadena, no una cadena para una subcadena.

¿Hay una solución fácil para esto?

Sí, puedes usar sustituciones y verificar con la cadena original:

 if not x%str1:bcd=%==x%str1% echo It contains bcd 

El bit %str1:bcd=% reemplazará un bcd en str1 con una cadena vacía, por lo que es diferente del original.

Si el original no contiene una cadena bcd , la versión modificada será idéntica.

Las pruebas con el siguiente script lo mostrarán en acción:

 @setlocal enableextensions enabledelayedexpansion @echo off set str1=%1 if not x%str1:bcd=%==x%str1% echo It contains bcd endlocal 

Y los resultados de varias ejecuciones:

 c:\testarea> testprog hello c:\testarea> testprog abcdef It contains bcd c:\testarea> testprog bcd It contains bcd 

Un par de notas:

  • La statement if es la carne de esta solución, todo lo demás es material de apoyo.
  • La x antes de los dos lados de la igualdad es para asegurar que la cadena bcd funciona bien. También protege contra ciertos caracteres iniciales “incorrectos”.

Puede canalizar la cadena de origen a findstr y verificar el valor de ERRORLEVEL para ver si se encontró la cadena de patrón. Un valor de cero indica éxito y se encontró el patrón. Aquí hay un ejemplo:

 :: : Y.CMD - Test if pattern in string : P1 - the pattern : P2 - the string to check :: @echo off echo.%2 | findstr /C:"%1" 1>nul if errorlevel 1 ( echo. got one - pattern not found ) ELSE ( echo. got zero - found pattern ) 

Cuando esto se ejecuta en CMD.EXE, obtenemos:

 C:\DemoDev>y pqrs "abc def pqr 123" got one - pattern not found C:\DemoDev>y pqr "abc def pqr 123" got zero - found pattern 

Normalmente hago algo como esto:

 Echo.%1 | findstr /C:"%2">nul && ( REM TRUE ) || ( REM FALSE ) 

Ejemplo:

 Echo.Hello world | findstr /C:"world">nul && ( Echo.TRUE ) || ( Echo.FALSE ) Echo.Hello world | findstr /C:"World">nul && (Echo.TRUE) || (Echo.FALSE) 

Salida:

 TRUE FALSE 

No sé si esta es la mejor manera.

Para compatibilidad y facilidad de uso, a menudo es mejor usar FIND para hacer esto.

También debe considerar si desea unir mayúsculas y minúsculas o mayúsculas y minúsculas.

El método con 78 puntos (creo que me refería a la publicación de paxdiablo) solo coincidirá con Case Sensitivamente, por lo que debes poner una verificación por separado para cada variación de caso para cada iteración posible que quieras emparejar.

(¡Qué dolor! ¡Con solo 3 letras significa 9 pruebas diferentes para lograr el control!)

Además, muchas veces es preferible hacer coincidir salida de comando, una variable en un bucle o el valor de una variable de puntero en su lote / CMD que no es tan sencillo.

Por estas razones, esta es una metodología alternativa preferible:

Uso: Encuentra [/ I] [/ V] “Caracteres a unir”

[/ I] (caso insensible) [/ V] (NO debe contener los caracteres)

Como Single Line:

 ECHO.%Variable% | FIND /I "ABC">Nul && ( Echo.Found "ABC" ) || ( Echo.Did not find "ABC" ) 

Multi-línea:

 ECHO.%Variable%| FIND /I "ABC">Nul && ( Echo.Found "ABC" ) || ( Echo.Did not find "ABC" ) 

Como se mencionó, esto es ideal para cosas que no están en las variables que también permiten la sustitución de cadenas:

 FOR %A IN (oihu AljB lojkAbCk) DO ( ECHO.%~A| FIND /I "ABC">Nul && ( Echo.Found "ABC" ) || ( Echo.Did not find "ABC" ) ) 

Salida de un comando:

 NLTest | FIND /I "ABC">Nul && ( Echo.Found "ABC" ) || ( Echo.Did not find "ABC" ) 

Como puede ver, esta es la forma superior de manejar el cheque por múltiples razones.

Si detecta presencia, esta es la solución más fácil:

 SET STRING=F00BAH SET SUBSTRING=F00 ECHO %STRING% | FINDSTR /C:"%SUBSTRING%" >nul & IF ERRORLEVEL 1 (ECHO CASE TRUE) else (ECHO CASE FALSE) 

Esto funciona muy bien para dejar caer el resultado de los comandos de Windows en una variable booleana. Simplemente reemplace el eco con el comando que desea ejecutar. También puede enhebrar Findstr juntos para calificar aún más una statement usando pipes. EG para Service Control (SC.exe)

 SC QUERY WUAUSERV | findstr /C:"STATE" | FINDSTR /C:"RUNNING" & IF ERRORLEVEL 1 (ECHO case True) else (ECHO CASE FALSE) 

Ese evalúa el resultado de SC Query para los servicios de actualización de Windows que aparece como un texto de línea múltiple, encuentra que la línea que contiene “estado” encuentra si la palabra “en ejecución” aparece en esa línea y establece el nivel de error en consecuencia.