J'ai le code suivant
if "%userInput%"==""" (
do_something
)
Je voudrais qu'il détecte si le %userInput%
est un citation( "
). Cependant, ce code génère une erreur.
Comment détecter si l'entrée est un citation ?
J'ai le code suivant
if "%userInput%"==""" (
do_something
)
Je voudrais qu'il détecte si le %userInput%
est un citation( "
). Cependant, ce code génère une erreur.
Comment détecter si l'entrée est un citation ?
Comme vous l'avez demandé "si l'entrée contient une citation". Juste find
il :
set "i=hello " world"
set i|find """" >nul && echo yes || echo no
Note : echo %i%|find """"
peut ne pas fonctionner avec des guillemets non appariés, mais set
ne s'en soucie pas.
Notez le """"
(l'aspect est étrange et peu intuitif). find
ne semble pas utiliser l'échappement habituel : find "^""
donne une erreur de syntaxe.
Voici une solution sans expansion retardée qui devrait fonctionner avec n'importe quelle entrée, y compris les espaces et les caractères empoisonnés. Mon code de test est dans une boucle. Lorsque vous êtes prêt à quitter, appuyez simplement sur <Enter>
sans avoir à taper quoi que ce soit.
@echo off
setlocal
:loop
set "var="
set /p "var=enter a string: "
if not defined var exit /b
if "%var:"=""%" == """" echo equals quote
echo(
goto loop
L'astuce devrait être assez évidente. Mettez la valeur entre guillemets, et doublez tous les guillemets internes pendant l'expansion, de sorte que tous les délimiteurs de jetons et les caractères de poison soient garantis d'être entre guillemets. Bien sûr, sur le côté droit, vous devez inclure les guillemets internes, plus le guillemet doublé que vous essayez de faire correspondre (pour un total de 4).
Si vous devez être en mesure de faire passer toutes les entrées (y compris l'absence de valeur) par le test IF, vous pouvez définir une variable de test. Quelque chose comme ce qui suit (en supposant que var contient déjà l'entrée de l'utilisateur)
set "test="
if defined var set "test=%var:"=""%"
if "%test%" == """" echo equals quote
Solution alternative utilisant FINDSTR
J'ai été inspiré par Réponse de Stephan pour trouver une solution alternative utilisant FINDSTR qui ne nécessite pas d'expansion retardée. Il a interprété la question différemment, répondant à la question "La valeur d'entrée contient-elle un guillemet à un endroit quelconque ?", et a résolu cette question en utilisant FIND.
Mais FIND ne peut pas déterminer si l'entrée correspond exactement à un caractère guillemet simple.
Un simple "one liner" avec FINDSTR peut résoudre ce problème.
2>nul set var|findstr /x ^"var=\"" >nul && echo equals quote
ou
2>nul set var|findstr /x "var=\"^" >nul && echo equals quote
Notez que FINDSTR exige généralement que les guillemets soient échappés en tant que \"
et l'analyseur syntaxique de lot exige que l'un des guillemets soit échappé en tant que ^"
parce qu'il y a un nombre impair de guillemets. Si un guillemet n'est pas échappé, alors le reste de la ligne est considéré comme faisant partie de la chaîne de caractères au lieu des opérations de redirection et d'exécution conditionnelle.
Notez également qu'avec l'analyseur batch, il est impossible d'échapper à une citation une fois celle-ci activée. La phrase suivante ne fonctionne donc PAS
2>nul set var|findstr /x "var=\^"" >nul && echo equals quote THIS DOES NOT WORK
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.