Fichier de commandes: Trouver si la sous-chaîne est en chaîne (pas dans un dossier)
Dans un fichier de commandes, j'ai une chaîne abcdefg
. Je veux vérifier si bcd
est dans la chaîne.
Malheureusement, il semble que toutes les solutions je suis la recherche de la recherche d'un fichier d'une chaîne, pas une chaîne de caractères d'une chaîne.
Est-il une solution simple pour cela?
- BTW, c'est généralement soit
Windows
etcmd
ou c'estms-dos
. MS-dos n'a pas été une partie de Windows pour un long moment.
Vous devez vous connecter pour publier un commentaire.
Oui, vous pouvez utiliser des substitutions et de contre-vérifier la chaîne d'origine:
La
%str1:bcd=%
peu pour remplacer unbcd
dansstr1
avec une chaîne vide, le rendant différent de l'original.Si l'original ne contient pas de
bcd
chaîne, la version modifiée sera identique.Test avec le script suivant va montrer en action:
Et les résultats de diverses pistes:
Un couple de notes:
if
déclaration est la viande de cette solution, tout le reste est de soutenir des trucs.x
avant que les deux côtés de l'égalité est de veiller à ce que la chaînebcd
fonctionne bien. Il protège également contre certaines "impropre" de départ des personnages.(set a=b)&&(echo %a:B=insensitive%)
echos insensible pour moi sur Win10.SET /P str1=<dummyPath\DummyFile.xxx
et nousecho was unexpected at this time.
. Je vais essayer d'utiliser FINDSTR maintenant."x%str1:bcd=%"=="x%str1%"
findstr
solution qui a fait exactement ce qui était nécessaire, plus lisible et plus facile à suivre.if "%VAR%" == "" ...
!
s?IF DEFINED VAR ( ... ) ELSE ( ... )
ouIF NOT DEFINED VAR ( ... ) ELSE ( ... )
au lieu de vérifier le contenu, parce que vous pouvez effectivement vérifier SI elles sont DÉFINIES dans une boucle sans expansion retardée activé. (IE fonctionne même sur les CLI, et pas seulement dans un script batch)C:\Admin>for /l %l in (1,1,10) DO @(IF NOT DEFINED TESTDef ( ECHO.Not Defined %l & SET "TestDef=%l") ELSE ( ECHO.Defined %l ) )
Défini Non Défini 1 2 3 4 Défini Défini 5 6 Défini 7 8 Défini 9 Défini 10C:\Admin>echo %TestDef%
1C:\Admin>for /l %l in (1,1,10) DO @(IF /I "%TESTDef2%" NEQ "" ( ECHO.Not Defined %l & SET "TestDef2=%l") ELSE ( ECHO.Defined %l ) )
Non Défini 1 Non Défini 2 Non 3 Non 4 Non Défini 5 Pas Défini 6 Pas Défini 7 8 Pas Défini 9 Pas Défini 10C:\Admin>echo %TestDef2%
10`C:\Admin>for /l %l in (1,1,10) DO @(IF NOT DEFINED TESTDef ( ECHO.Not Defined %l & SET "TestDef=%l") ELSE ( ECHO.Defined %l & SET "TestDef=" ) )
défini Non Défini 1 2 3 4 Non Défini 5 Défini 6 Pas Défini 7 8 Pas Défini 9 Défini 10:
(colonne)? Est-il échapper à un caractère?Vous pouvez tuyau de la chaîne source à
findstr
et vérifier la valeur deERRORLEVEL
pour voir si la chaîne de motif a été trouvé. Une valeur de zéro indique que le succès et le motif a été trouvé. Voici un exemple:Lorsque cela est exécuté dans CMD.EXE, nous obtenons:
J'ai l'habitude de faire quelque chose comme ceci:
Exemple:
De sortie:
Je ne sais pas si c'est la meilleure façon.
Pour la compatibilité et la facilité d'utilisation, il est souvent préférable d'utiliser FIND pour ce faire.
Vous devez également prendre en compte si vous souhaitez correspondre cas de tact ou de cas insensiblement.
La méthode avec 78 points (je crois que je faisais allusion à paxdiablo post) ne correspondent Cas de Sensibilité, donc vous devez placer un chèque séparé pour chaque cas de variation pour chaque itération, vous souhaiterez peut-être correspond.
( Quelle douleur! À seulement 3 lettres qui signifie 9 différents tests dans le but de réaliser les check! )
En outre, de nombreuses fois, il est préférable de faire correspondre la sortie de la commande, une variable dans une boucle, ou la valeur d'un pointeur de variable dans le lot/CMD qui n'est pas aussi simple.
Pour ces raisons, c'est une alternative préférable à la méthodologie:
Utilisation: Find [/I] [/V] "les Personnages de Match"
[/I] (Insensible à la casse)
[/V] (il ne Doit PAS contenir les caractères)
Comme Seule Ligne:
Multi-ligne:
Comme mentionné, ce qui est excellent pour des choses qui ne sont pas des variables qui permettent de substitution de chaîne ainsi:
De la sortie d'une commande:
Comme vous pouvez le voir c'est le meilleur moyen de gérer la case à cocher pour plusieurs raisons.
setlocal EnableExtensions
puisIF /I
à faire de la casse des comparaisons.Si vous êtes la détection de la présence, ici, est la solution la plus simple:
Cela fonctionne très bien à la descente de la sortie de windows les commandes dans une variable booléenne. Il suffit de remplacer l'écho avec la commande que vous souhaitez exécuter. Vous pouvez aussi chaîne Findstr de l'ensemble de qualifier davantage une déclaration à l'aide de tuyaux. E. G. pour le Service de Contrôle (SC.exe)
Que l'on évalue la sortie de SC Query pour les services windows update qui ne sort qu'un texte multiligne, trouve la ligne contenant "état" se retrouve alors si le mot "exécution" se produit sur cette ligne, et définit la variable errorlevel 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)
Meilleure réponse a été ici:
Je suis probablement un peu trop tard avec cette réponse, mais le a accepté de répondre ne fonctionne que pour vérifier si une "chaîne codée en dur" est une partie de la chaîne de recherche.
Pour la recherche dynamique, vous avez pour ce faire:
Remarque: Vous pouvez prendre les deux variables comme arguments.