Em um arquivo em lotes, eu tenho uma string abcdefg
. Quero verificar se bcd
está na string.
Infelizmente, parece que todas as soluções que estou encontrando pesquisam um arquivo por uma substring, não uma string para uma substring.
Existe uma solução fácil para isso?
Windows
ecmd
ou éms-dos
. O MSDOS não faz parte do Windows há muito tempo.Respostas:
Sim, você pode usar substituições e comparar com a sequência original:
O
%str1:bcd=%
bit substituirá umbcd
instr1
por uma string vazia, tornando-o diferente do original.Se o original não contiver uma
bcd
string, a versão modificada será idêntica.Testar com o seguinte script o mostrará em ação:
E os resultados de várias execuções:
Algumas notas:
if
afirmação é a base desta solução, tudo o resto é material de suporte.x
antes dos dois lados da igualdade é garantir que a stringbcd
funcione bem. Também protege contra certos caracteres iniciais "impróprios".fonte
Você pode canalizar a cadeia de origem
findstr
e verificar o valor deERRORLEVEL
para ver se a cadeia de padrão foi encontrada. Um valor zero indica sucesso e o padrão foi encontrado. Aqui está um exemplo:Quando isso é executado no CMD.EXE, obtemos:
fonte
Eu costumo fazer algo assim:
Exemplo:
Resultado:
Não sei se é o melhor caminho.
fonte
Para compatibilidade e facilidade de uso, geralmente é melhor usar o FIND para fazer isso.
Você também deve considerar se deseja corresponder maiúsculas de minúsculas ou maiúsculas de minúsculas.
O método com 78 pontos (acredito que estava me referindo à postagem de paxdiablo) corresponderá apenas a maiúsculas e minúsculas, portanto, você deve colocar uma verificação separada para todas as variações de maiúsculas e minúsculas para cada iteração possível que desejar.
(Que dor! Com apenas 3 letras, isso significa 9 testes diferentes para realizar a verificação!)
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, o que não é tão simples.
Por esses motivos, essa é uma metodologia alternativa preferível:
Uso: Encontre [/ I] [/ V] "Caracteres a Combinar"
[/ I] (não faz distinção entre maiúsculas e minúsculas) [/ V] (NÃO deve conter os caracteres)
Como linha única:
Multi-linha:
Como mencionado, isso é ótimo para coisas que não estão em variáveis que também permitem a substituição de strings:
fonte
setlocal EnableExtensions
-loIF /I
para fazer comparações sem distinção entre maiúsculas e minúsculas.Se você está detectando presença, aqui está a solução mais fácil:
Isso funciona muito bem para soltar a saída dos comandos do Windows em uma variável booleana. Apenas substitua o eco pelo comando que você deseja executar. Você também pode agrupar o Findstr para qualificar ainda mais uma declaração usando pipes. EG para Controle de Serviço (SC.exe)
A pessoa 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, localiza se a palavra "running" ocorre nessa linha e define o nível de erro de acordo.
fonte
SET STRING=abcdefgh SET SUBSTRING=bcd ECHO %STRING% | FINDSTR /C:"%SUBSTRING%" >nul & IF ERRORLEVEL 1 (ECHO CASE FALSE) else (ECHO CASE TRUE)
Provavelmente estou chegando tarde demais com esta resposta, mas a resposta aceita funciona apenas para verificar se uma "sequência codificada" faz parte da sequência de pesquisa.
Para pesquisa dinâmica, você teria que fazer o seguinte:
Nota: Você pode usar as duas variáveis como argumentos.
fonte
Melhor resposta foi aqui :
fonte
fonte
As soluções que pesquisam um arquivo por uma substring também podem pesquisar uma string , por exemplo.
find
oufindstr
.No seu caso, a solução fácil mais seria inserir uma string no comando em vez de fornecer um nome de arquivo, por exemplo.
sequência que diferencia maiúsculas de minúsculas:
echo "abcdefg" | find "bcd"
ignorar maiúsculas de minúsculas:
echo "abcdefg" | find /I "bcd"
Se nenhuma correspondência for encontrada, você receberá uma resposta de linha em branco no CMD e% ERRORLEVEL% definido como 1
fonte