Respuestas:
Sí, puede usar sustituciones y verificar con la cadena original:
if not x%str1:bcd=%==x%str1% echo It contains bcd
La %str1:bcd=%
bits reemplazará a una bcd
de str1
con una cadena vacía, por lo que es diferente de la original.
Si el original no contiene una bcd
cadena, la versión modificada será idéntica.
La prueba con el siguiente script lo mostrará 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:
if
declaración es la carne de esta solución, todo lo demás es material de soporte.x
anterior a los dos lados de la igualdad es asegurar que la cadena bcd
funcione bien. También protege contra ciertos caracteres iniciales "inapropiados".Puede canalizar la cadena de origen 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
Usualmente 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.
Por compatibilidad y facilidad de uso, a menudo es mejor usar FIND para hacer esto.
También debe considerar si desea hacer coincidir 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 mayúsculas y minúsculas, por lo que debe marcar por separado cada variación de caso para cada iteración posible que desee que coincida.
(¡Qué pena! ¡Con solo 3 letras, eso significa 9 pruebas diferentes para realizar la verificación!)
Además, muchas veces es preferible hacer coincidir la salida del 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: Buscar [/ I] [/ V] "Personajes para unir"
[/ I] (mayúsculas y minúsculas) [/ V] (NO debe contener los caracteres)
Como línea única:
ECHO.%Variable% | FIND /I "ABC">Nul && ( Echo.Found "ABC" ) || ( Echo.Did not find "ABC" )
Multilí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 variables que también permiten la sustitución de cadenas:
FOR %A IN (
"Some long string with Spaces does not contain the expected string"
oihu AljB
lojkAbCk
Something_Else
"Going to evaluate this entire string for ABC as well!"
) DO (
ECHO.%~A| FIND /I "ABC">Nul && (
Echo.Found "ABC" in "%A"
) || ( Echo.Did not find "ABC" )
)
Output From a command:
NLTest | FIND /I "ABC">Nul && ( Echo.Found "ABC" ) || ( Echo.Did not find "ABC" )
As you can see this is the superior way to handle the check for multiple reasons.
setlocal EnableExtensions
a continuación, IF /I
hacer comparaciones mayúsculas y minúsculas.
Si está detectando 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 colocar la salida de los comandos de Windows en una variable booleana. Simplemente reemplace el eco con el comando que desea ejecutar. También puede encadenar Findstr's para calificar aún más una declaración utilizando tuberías. EG para Control de Servicio (SC.exe)
SC QUERY WUAUSERV | findstr /C:"STATE" | FINDSTR /C:"RUNNING" & IF ERRORLEVEL 1 (ECHO case True) else (ECHO CASE FALSE)
Ese evalúa la salida de SC Query para los servicios de actualización de Windows que sale como un texto multilínea, encuentra la línea que contiene "estado" y luego encuentra si la palabra "en ejecución" aparece en esa línea, y establece el nivel de error en consecuencia.
SET STRING=abcdefgh SET SUBSTRING=bcd ECHO %STRING% | FINDSTR /C:"%SUBSTRING%" >nul & IF ERRORLEVEL 1 (ECHO CASE FALSE) else (ECHO CASE TRUE)
Probablemente llegue demasiado tarde con esta respuesta, pero la respuesta aceptada solo funciona para verificar si una "cadena codificada" es parte de la cadena de búsqueda.
Para la búsqueda dinámica, tendría que hacer esto:
SET searchString=abcd1234
SET key=cd123
CALL SET keyRemoved=%%searchString:%key%=%%
IF NOT "x%keyRemoved%"=="x%searchString%" (
ECHO Contains.
)
Nota: Puede tomar las dos variables como argumentos.
Mejor respuesta estaba aquí :
set "i=hello " world"
set i|find """" >nul && echo contains || echo not_contains
ECHO %String%| FINDSTR /C:"%Substring%" && (Instructions)
Las soluciones que buscan un archivo para una subcadena también pueden buscar una cadena , por ejemplo. find
o findstr
.
En tu caso, la solución fácil sería canalizar una cadena en el comando en lugar de proporcionar un nombre de archivo, por ejemplo.
cadena sensible a mayúsculas y minúsculas:
echo "abcdefg" | find "bcd"
ignorar caso de cadena:
echo "abcdefg" | find /I "bcd"
SI no se encuentra ninguna coincidencia, obtendrá una respuesta de línea en blanco en CMD y% ERRORLEVEL% establecido en 1
Windows
ycmd
o esms-dos
. MSDOS no ha sido parte de Windows durante mucho tiempo.