Réponses:
Oui, vous pouvez utiliser des substitutions et vérifier la chaîne d'origine:
if not x%str1:bcd=%==x%str1% echo It contains bcd
Le %str1:bcd=%
bit remplacera un bcd
in str1
par une chaîne vide, ce qui le rend différent de l'original.
Si l'original ne contenait 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 de différentes séries:
c:\testarea> testprog hello
c:\testarea> testprog abcdef
It contains bcd
c:\testarea> testprog bcd
It contains bcd
Quelques notes:
if
déclaration est la viande de cette solution, tout le reste est du support.x
avant des deux côtés de l'égalité est de s'assurer que la chaîne bcd
fonctionne correctement. Il protège également contre certains caractères de départ "incorrects".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 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
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)
Production:
TRUE
FALSE
Je ne sais pas si c'est la meilleure façon.
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 correspondre la casse de manière sensible ou insensible.
La méthode avec 78 points (je pense que je faisais référence au message de paxdiablo) ne correspondra qu'à la sensibilité à la casse, vous devez donc cocher séparément chaque variation de cas pour chaque itération possible que vous souhaitez faire correspondre.
(Quelle douleur! À seulement 3 lettres, cela signifie 9 tests différents afin d'accomplir la vérification!)
De plus, il est souvent préférable de faire correspondre la sortie de la 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éthodologie alternative préférable:
Utilisez: Rechercher [/ I] [/ V] "Caractères à associer"
[/ I] (insensible à la casse) [/ V] (ne doit PAS contenir les caractères)
En ligne simple:
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 idéal pour les choses qui ne sont pas dans des variables qui permettent également la substitution de chaînes:
FOR %A IN (
"Some long string with Spaces does not contain the expected string"
oihu AljB
lojkAbCk
Something_Else
"Going to evaluate this entire string for ABC as well!"
) DO (
ECHO.%~A| FIND /I "ABC">Nul && (
Echo.Found "ABC" in "%A"
) || ( Echo.Did not find "ABC" )
)
Output From a command:
NLTest | FIND /I "ABC">Nul && ( Echo.Found "ABC" ) || ( Echo.Did not find "ABC" )
As you can see this is the superior way to handle the check for multiple reasons.
setlocal EnableExtensions
ensuite utiliser IF /I
pour effectuer des comparaisons insensibles à la casse.
Si vous détectez une 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 déposer la sortie des commandes Windows dans une variable booléenne. Remplacez simplement l'écho par la commande que vous souhaitez exécuter. Vous pouvez également enchaîner les chaînes de Findstr pour qualifier davantage une instruction à l'aide de canaux. EG pour le contrôle des services (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 Windows qui se présente sous la forme d'un texte multiligne, trouve la ligne contenant "état" puis recherche si le mot "en cours d'exécution" apparaît sur cette ligne et définit le niveau d'erreur en conséquence.
SET STRING=abcdefgh SET SUBSTRING=bcd ECHO %STRING% | FINDSTR /C:"%SUBSTRING%" >nul & IF ERRORLEVEL 1 (ECHO CASE FALSE) else (ECHO CASE TRUE)
J'arrive probablement 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 devez procéder comme suit:
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.
La meilleure réponse était ici :
set "i=hello " world"
set i|find """" >nul && echo contains || echo not_contains
ECHO %String%| FINDSTR /C:"%Substring%" && (Instructions)
Les solutions qui recherchent un fichier pour une sous-chaîne peuvent également rechercher une chaîne , par exemple. find
ou findstr
.
Dans votre cas, la solution simple serait de diriger une chaîne vers la commande au lieu de fournir un nom de fichier, par exemple.
chaîne sensible à la casse:
echo "abcdefg" | find "bcd"
ignorer la casse de la chaîne:
echo "abcdefg" | find /I "bcd"
SI aucune correspondance trouvée, vous obtiendrez une réponse de ligne vierge sur CMD et% ERRORLEVEL% défini sur 1
Windows
etcmd
ou c'estms-dos
. MSDOS ne fait pas partie de Windows depuis longtemps .