Fichier Batch: recherche Si la sous-chaîne est dans la chaîne (pas dans un fichier)

Dans un fichier batch, j'ai une chaîne abcdefg. Je veux vérifier si bcd est dans la chaîne.

Malheureusement, il semble que toutes les solutions que je trouve recherchent un fichier pour une sous-chaîne, pas une chaîne pour une sous-chaîne.

Y a-t-il une solution facile pour cela?

161
demandé sur Ben 0000-00-00 00:00:00

5 réponses

Oui, vous pouvez utiliser des substitutions et vérifier par rapport à la chaîne d'origine:

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

Le bit %str1:bcd=% remplacera un bcd dans str1 par une chaîne vide, la rendant différente de l'original.

Si l'original ne contient pas de bcd chaîne, la version modifiée sera identique.

Le test avec le script suivant le montrera en action:

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

Et les résultats des différentes courses:

c:\testarea> testprog hello

c:\testarea> testprog abcdef
It contains bcd

c:\testarea> testprog bcd
It contains bcd

Quelques notes:

  • Le if déclaration est la viande de cette solution, tout le reste est des trucs de soutien.
  • le x avant les deux côtés de l'égalité est de s'assurer que la chaîne bcd fonctionne bien. Il protège également contre certains caractères de départ "inappropriés".
231
répondu paxdiablo 2017-07-13 02:27:05

Vous pouvez rediriger la chaîne source vers findstr et vérifier la valeur de ERRORLEVEL pour voir si la chaîne de motif a été trouvée. Une valeur de zéro indique le succès et le modèle a été trouvé. Voici un exemple:

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

Lorsque cela est exécuté dans CMD.EXE, nous obtenons:

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
97
répondu ghostdog74 2012-11-07 22:17:30

Je fais habituellement quelque chose comme ceci:

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

Exemple:

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

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

Sortie:

TRUE
FALSE

Je ne sais pas si c'est la meilleure façon.

37
répondu user839791 2014-01-12 08:12:34

Pour la compatibilité et la facilité d'utilisation, il est souvent préférable d'utiliser FIND pour ce faire.

Vous devez également considérer si vous souhaitez faire correspondre la casse de manière sensible ou insensible à la casse.

La méthode avec 78 points (je crois que je faisais référence au post de paxdiablo) ne correspondra Qu'à la casse, vous devez donc vérifier séparément chaque variation de cas pour chaque itération possible.

( Quelle douleur! À seulement 3 lettres cela signifie 9 tests différents afin de accomplissez le chèque! )

De plus, il est souvent préférable de faire correspondre la sortie de commande, une variable dans une boucle ou la valeur d'une variable de pointeur dans votre batch/CMD qui n'est pas aussi simple.

Pour ces raisons, il s'agit d'une méthode alternative préférable:

Utiliser: trouver [/I] [/V] "caractères à correspondre"

[/I] (insensible à la casse) [/V] (ne doit pas contenir les caractères)

Comme Une Seule Ligne:

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

Multi-Ligne:

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

Comme mentionné ceci est génial pour les choses qui ne sont pas dans les variables qui permettent également la substitution de chaîne:

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

Sortie D'une commande:

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

Comme vous pouvez le voir, c'est la meilleure façon de gérer la vérification pour plusieurs raisons.

13
répondu Ben Personick 2017-08-01 17:54:36

Si vous détectez la présence, voici la solution la plus simple:

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

Cela fonctionne très bien pour supprimer la sortie des commandes windows dans une variable booléenne. Il suffit de remplacer l'echo wi

6
répondu