En un archivo por lotes, tengo una cadena abcdefg
. Quiero verificar si bcd
está en la cadena.
Desafortunadamente, parece que todas las soluciones que encuentro buscan un archivo para una subcadena, no una cadena para una subcadena.
¿Hay una solución fácil para esto?
Windows
ycmd
o esms-dos
. MSDOS no ha sido parte de Windows durante mucho tiempo.Respuestas:
Sí, puede usar sustituciones y verificar con la cadena original:
La
%str1:bcd=%
bits reemplazará a unabcd
destr1
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:
Y los resultados de varias ejecuciones:
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 cadenabcd
funcione bien. También protege contra ciertos caracteres iniciales "inapropiados".fuente
Puede canalizar la cadena de origen
findstr
y verificar el valor deERRORLEVEL
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:Cuando esto se ejecuta en CMD.EXE, obtenemos:
fuente
Usualmente hago algo como esto:
Ejemplo:
Salida:
No sé si esta es la mejor manera.
fuente
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:
Multilínea:
Como se mencionó, esto es ideal para cosas que no están en variables que también permiten la sustitución de cadenas:
fuente
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:
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)
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.
fuente
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:
Nota: Puede tomar las dos variables como argumentos.
fuente
Mejor respuesta estaba aquí :
fuente
fuente
Las soluciones que buscan un archivo para una subcadena también pueden buscar una cadena , por ejemplo.
find
ofindstr
.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
fuente