Windows Lot de vérifier si la variable commence par, se termine avec et contient une chaîne de caractères
Je suis en train de vérifier si une variable dans un fichier de commandes commence avec "
contient BETA
quelque part et se termine avec ")
.
Est-il possible?
Et si oui, quelqu'un peut m'aider?
OriginalL'auteur BrainStone | 2013-03-29
Vous devez vous connecter pour publier un commentaire.
Où il y a une volonté...
De la définition de variables avec déséquilibrée
"
peut être délicat. Je l'ai juste mis en place équilibré et trancha le dernier caractère (:llcheck
entrée : lop dernier et vérifier.Essentiall, j'ai copié la variable dans
var2
etvarvar
dans oder pour la démo de ce qui se passe si ces variablenames être ensemble.Deux fichiers sont alors générés.
TEST1.TXT
contient la première et la dernière 2 caractère devar
etTEST2.TXT
simplement"")
Comparer les deux si ils ne sont pas identiques, alors la variable ne démarre PAS
"
et à la fin")
bien pourrait simplement avoir écritvar
à un fichier et utiliséfindstr
pour trouverbeta
, mais j'ai décidé d'envoyer la sortie deSET var
qui devrait être le contenu deALL
de lavar*
variables dans le formulaireen findstr, trouver celui qui commence (
/b
)var=
et de trouver si QUE contient la chaîne de caractèresbeta
La/i
sélectionne pas sensible à la casse. Si vous voulez spécifiquementBETA
en majuscules, il suffit de changerbeta
àBETA
et retirer le/i
.result
est fixé àY
ouN
Cela fonctionne certes, mais il y a une solution beaucoup plus simple en utilisant un seul FINDSTR regex de recherche. Voir ma réponse
OriginalL'auteur Magoo
En supposant que la variable ne contient pas de ligne de flux, ou des retours chariot, puis tout ce qui est nécessaire est une seule commande FINDSTR. Il a limité le support des expressions régulières qui est plus que suffisant pour ce problème.
Seulement TEST11 passe.
La
/R
option forces de la chaîne de recherche pour être traitée comme une expression régulière.La
/X
option signifie qu'il doit être une correspondance exacte - l'ensemble de la chaîne doit correspondre à la chaîne de recherche..*
est la regex expression générique qui va correspondre à n'importe quelle chaîne de caractères.Je redirige l'FINDSTR sortie de NUL parce que nous n'avons pas besoin de voir la ligne. Nous voulons simplement que le code de retour
FINDSTR nécessite une double citation littéraux être échappé que
\"
Utilisation expansion retardée de sorte que vous pouvez en toute sécurité l'écho de toute valeur dans la variable.
- Je utiliser
&&
conditionnelle, de prendre des mesures lorsque FINDSTR réussi, et||
conditionnelle, de prendre des mesures lorsque FINDSTR échoué.Mon
:TEST
routine prend le nom de la variable comme unique argument.Noter que dans certaines situations, le lot analyseur exige que vous aussi échapper à la double quote
^"
, sens totalement échappé devis ressemblera\^"
. Mais cette complication n'est pas nécessaire dans votre cas. Le FINDSTR échapper règles sont en fait un peu bancale. Voir Quelles sont les sans-papiers, les caractéristiques et les limites de la Windows commande FINDSTR? pour plus d'info.Mon code de test ne tenant compte de la casse de la recherche. Donc
beta
ne correspondent pasBETA
. Si vous souhaitez une recherche insensible à la casse, alors il suffit d'ajouter le/I
option.EDIT: 2015-07-22
Une autre option, si et seulement si vous souhaitez ignorer les cas, est d'utiliser une combinaison de l'expansion des variables de chercher/remplacer, et de l'expansion de sous-chaîne des opérations. Les deux test10 et test11 passe ci-dessous.
La première, SI des contrôles pour
beta
n'importe où (à la casse). La deuxième, SI des contrôles pour"
au début, et le dernier, SI des contrôles pour")
à la fin. La seule chose la plus délicate est de savoir comment échapper à la comparaison de chaîne quand il a un nombre impair de citations.findstr /rx \".*BETA.*\")
? Oui, c'est une vieille réponse, mais je viens de voir un lien à ce sujet...Je ne vois pas pourquoi vous vous en doutez peut-être dans l'erreur. La chaîne n'apparaît jamais dans un bloc de code, de sorte que les sociétés non cotées, sans échappement droit parenthèse jamais des causes d'un problème. J'ai aussi testé le code, et ça fonctionne.
Ok. Peut-être qu'il ne cause pas de problème erreur, mais je ne vois pas de raison d'inclure un droit parenthèse à cet endroit, à l'exception d'une faute de frappe...
Ce n'est certainement n'est pas une faute de frappe - le droit parenthèse est là parce que l'OP veut rechercher une chaîne de caractères qui se termine par un droit parenthèse. Les guillemets sont échappés (à partir d'un FINDSTR point de vue), de sorte qu'ils sont inclus en tant que partie de la chaîne de recherche.
Oui, vous avez raison! J'ai été confondu par l'échappé guillemets! de ma faute... 🙁
OriginalL'auteur dbenham
De sortie:
La façon de traiter avec déséquilibrée cite (et avec d'autres Lots spécial des personnages, en effet) est d'utiliser Expansion Retardée: de cette façon, les citations et les caractères spéciaux ne s'affichent pas dans la ligne de commande pour être analysée.
N'oubliez pas d'échapper à ^ tout droit des parenthèses qui ne sont pas des parenthèses de fermeture de blocs de commande.
Un moyen facile de vérifier si une variable contient une chaîne de caractères est d'essayer d'éliminer la chaîne de valeur de variable: si le résultat est différent de la valeur d'origine, alors la variable contenant la chaîne.
Antonio
OriginalL'auteur Aacini