web-dev-qa-db-fra.com

Fichier de commandes: recherchez si la sous-chaîne est dans une 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 trouvées trouvent 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?

188
Ben

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, ce qui le rend différent de l'original.

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

Tester 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 de différentes courses:

c:\testarea> testprog hello

c:\testarea> testprog abcdef
It contains bcd

c:\testarea> testprog bcd
It contains bcd

Quelques notes:

  • La déclaration if est le fondement de cette solution, tout le reste est du support.
  • La x devant les deux côtés de l'égalité consiste à s'assurer que la chaîne bcd fonctionne correctement. Il protège également contre certains caractères de départ "incorrects".
267
paxdiablo

Vous pouvez diriger la chaîne source vers findstr et vérifier la valeur de ERRORLEVEL pour voir si la chaîne de modèle a été trouvée. Une valeur de zéro indique un succès et le motif 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
102
ghostdog74

Je fais habituellement quelque chose comme ça:

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.

42
user839791

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

Vous devez également déterminer si vous souhaitez faire la distinction entre les majuscules et les minuscules.

La méthode avec 78 points (je pense que je faisais référence au message de paxdiablo) correspond uniquement à Case Sensitively, vous devez donc cocher séparément chaque variation de cas pour chaque itération possible que vous souhaitez associer.

(Quelle douleur! À seulement 3 lettres, cela signifie 9 tests différents afin de réaliser le test!)

En outre, 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 lot/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 à associer"

[/ 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é, c’est bien pour les choses qui ne sont pas dans les variables qui permettent aussi la substitution de chaînes:

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 constater, c’est le meilleur moyen de traiter le chèque pour plusieurs raisons.

19
Ben Personick

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 laisser tomber la sortie des commandes windows dans une variable booléenne. Il suffit de remplacer l'écho par la commande que vous voulez exécuter. Vous pouvez également enchaîner Findstr pour qualifier davantage une instruction à l'aide de tubes. PAR EXEMPLE. pour le contrôle de service (SC.exe)

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

Celui-ci évalue la sortie de SC Query pour les services de mise à jour de Windows qui apparaît sous forme de texte multiligne, trouve la ligne contenant "état", puis détermine si le mot "en cours d'exécution" apparaît sur cette ligne et définit le niveau d'erreur. en conséquence.

9
byorking

La meilleure réponse était ici :

set "i=hello " world"
set i|find """" >nul && echo contains || echo not_contains
1
T.Todua

Je vais probablement arriver un peu trop tard avec cette réponse, mais la réponse acceptée ne fonctionne que pour vérifier si une "chaîne codée en dur" fait partie de la chaîne de recherche.

Pour une recherche dynamique, vous devriez faire ceci:

SET searchString=abcd1234
SET key=cd123

CALL SET keyRemoved=%%searchString:%key%=%%

IF NOT "x%keyRemoved%"=="x%searchString%" (
    ECHO Contains.
)

Remarque: Vous pouvez prendre les deux variables comme arguments.

1
Andy Sug
ECHO %String%| FINDSTR /C:"%Substring%" && (Instructions)
0
Riccardo La Marca