Arquivo em lote: Localizar se a substring está em string (não em um arquivo)

Em um arquivo de lote, eu tenho uma string abcdefg . Eu quero verificar se o bcd está na string.

Infelizmente, parece que todas as soluções que estou encontrando pesquisam um arquivo para uma substring, não uma string para uma substring.

Existe uma solução fácil para isso?

Sim, você pode usar substituições e verificar a string original:

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

O %str1:bcd=% bit irá replace um bcd no str1 por um string vazio, tornando-o diferente do original.

Se o original não continha uma string bcd , a versão modificada será idêntica.

O teste com o script a seguir mostrará isso em ação:

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

E os resultados de várias execuções:

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

Um par de notas:

  • A declaração if é a carne desta solução, todo o resto é material de apoio.
  • O x antes dos dois lados da igualdade é garantir que a string bcd funcione bem. Também protege contra certos caracteres iniciais “impróprios”.

Você pode canalizar a string de origem para findstr e verificar o valor de ERRORLEVEL para ver se a string padrão foi encontrada. Um valor de zero indica sucesso e o padrão foi encontrado. Aqui está um exemplo:

 :: : 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 ) 

Quando isso é executado no CMD.EXE, obtemos:

 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 

Eu costumo fazer algo assim:

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

Exemplo:

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

Saída:

 TRUE FALSE 

Eu não sei se esse é o melhor caminho.

Para compatibilidade e facilidade de uso, é melhor usar o FIND para fazer isso.

Você também deve considerar se deseja combinar maiúsculas e minúsculas com sensibilidade ou diferencia maiúsculas de minúsculas.

O método com 78 pontos (creio que eu estava me referindo ao post do paxdiablo) só corresponderá a Case Sensitively, então você deve colocar um cheque separado para cada variação de caso para cada iteração possível que você queira combinar.

(Que dor! Com apenas 3 letras significa 9 testes diferentes para realizar o teste!)

Além disso, muitas vezes é preferível combinar a saída do comando, uma variável em um loop ou o valor de uma variável de ponteiro no seu lote / CMD que não seja tão simples.

Por estas razões, esta é uma metodologia alternativa preferível:

Use: Encontre [/ I] [/ V] “Caracteres para Correspondência”

[/ I] (caso insensível) [/ V] (não deve conter os caracteres)

Como única linha:

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

Multilinha:

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

Como mencionado, isso é ótimo para coisas que não estão em variables ​​que permitem a substituição de strings:

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

Saída de um comando:

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

Como você pode ver, essa é a maneira superior de lidar com a verificação por vários motivos.

Se você está detectando a presença, aqui está a solução mais fácil:

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

Isso funciona muito bem para descartar a saída de comandos do Windows em uma variável booleana. Apenas substitua o eco pelo comando que você deseja executar. Você também pode vincular o Findstr juntos para qualificar ainda mais uma instrução usando pipes. EG para controle de serviço (SC.exe)

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

Aquele avalia a saída do SC Query para serviços de atualização do Windows, que sai como um texto de múltiplas linhas, localiza a linha que contém “state” e, em seguida, descobre se a palavra “running” ocorre nessa linha e define o errorlevel de acordo.