84 votes

Comment puis-je échapper à un point d'exclamation ! dans les scripts cmd ?

Quand j'ai setlocal ENABLEDELAYEDEXPANSION dans un cmd script y a-t-il un moyen d'échapper un ! que je veux utiliser comme paramètre à une commande ?

@echo off
setlocal ENABLEDELAYEDEXPANSION
echo I want to go out with a bang!
echo I still want to go out with a bang^!

98voto

FrVaBe Points 14559

C'est ce que j'ai trouvé (^^)

@echo off
setlocal ENABLEDELAYEDEXPANSION
echo I want to go out with a bang^^!

3 votes

Par ailleurs, si vous deviez remplacer un point d'exclamation dans une variable, comment feriez-vous ?

2 votes

@crosenblum Je vous recommande de poser cette question comme une question à part entière. Ainsi, elle sera visible pour tous les membres de l'OS et aura probablement une réponse.

1 votes

Cette solution (ou les autres) ne fonctionnera pas si le point d'exclamation se trouve dans une variable que vous définissez/utilisez ou que vous transmettez à un label d'appel, auquel cas je pense que vous n'aurez pas de chance.

78voto

jeb Points 26035

Une remarque supplémentaire à la réponse de FrVaBe .

Normalement, le ^^! fonctionne, mais entre guillemets, vous n'avez besoin que de ^! à la place.

echo I want to go out with a bang^^!
echo He said "Bang^!"

C'est le résultat du mécanisme d'échappement de l'analyseur syntaxique de lot.

Tout d'abord, l'analyseur syntaxique analyse une ligne et le signe d'insertion échappe le caractère suivant, dans ce cas, il a un effet pour &|<>()"<linefeed> mais seulement en dehors des guillemets, car à l'intérieur des guillemets, tous les caractères sont "normaux" et le signe d'insertion lui-même n'a aucun effet.

Avec l'expansion retardée, une étape d'analyse supplémentaire suit, le signe d'insertion est également un caractère d'échappement pour le caractère suivant, mais il n'affecte que le caractère d'insertion. ! et ^ et les guillemets sont ignorés dans cette étape d'analyse. Cette étape supplémentaire ne sera exécutée que s'il y a au moins un fichier de type ! dans la ligne.

setlocal DisableDelayedExpansion
echo DisableDelayedExpansion
echo one caret^^
echo one caret^^  bang! "boom^!"

echo(
setlocal EnableDelayedExpansion
echo EnableDelayedExpansion
echo one caret^^
echo none caret^^  bang^^! "boom^!"

---- SORTIE ------

DisableDelayedExpansion
one caret^
one caret^  bang! "boom^!"

EnableDelayedExpansion
one caret^
none caret  bang! "boom!"

EDIT

Voici un exemple légèrement modifié qui illustre mieux les différentes permutations d'échappement qui sont nécessaires, selon le contexte. Le seul cas qui nécessite un échappement inhabituel est le dernier exemple, lorsque l'expansion retardée est activée et qu'il existe au moins un fichier ! sur la ligne.

@echo off
setlocal DisableDelayedExpansion
echo DisableDelayedExpansion
echo caret^^       "caret^"
echo caret^^ bang! "caret^ bang!"

echo(
setlocal EnableDelayedExpansion
echo EnableDelayedExpansion
echo caret^^       "caret^"
echo caret^^^^ bang^^! "caret^^ bang^!"

-- OUTPUT --

DisableDelayedExpansion
caret^       "caret^"
caret^ bang! "caret^ bang!"

EnableDelayedExpansion
caret^       "caret^"
caret^ bang! "caret^ bang!"

19voto

Aditya Sharma Points 156

Pour utiliser un point d'explication dans un lot avec l'expansion retardée activée, vous devez d'abord ajouter le point d'explication à une variable avec cette dernière désactivée. Voir l'exemple ci-dessous avec les deux DISABLEDELAYEDEXPANSION y ENABLEDELAYEDEXPANSION l'État.

@echo off
setlocal DISABLEDELAYEDEXPANSION
set DB_password=encrypt!Pws
echo %DB_password%
SETLOCAL ENABLEDELAYEDEXPANSION
echo !DB_password!

0 votes

Meilleure réponse ! Cela résout l'utilisation dans les scripts où DELAYEDEXPANSION est nécessaire.

0 votes

C'est aberrant. La mémoire n'est mentionnée nulle part dans les exigences et pourtant je l'utilise beaucoup sans aucun effet négatif. A moins que vous ne puissiez réellement contribuer, gardez vos absurdités pour vous.

0 votes

En fait, j'ai écrit mon code comme le tien, puis j'ai pensé "cela ne peut pas fonctionner, parce que le ! sera perdu avec l'expansion retardée activée", j'ai cherché une solution sur tout l'internet, j'ai atterri ici, j'ai lu la dernière réponse et j'ai découvert que mon code aurait fonctionné tout le temps, je n'avais juste pas réalisé qu'il n'était remplacé qu'une fois... Merci beaucoup ^!^ ! ;D

6voto

Merci. Pour ajouter à ce point précieux, si son script contient une variable dont la valeur contient un " !", alors l'approche suivante rendra cette valeur telle quelle :

@echo off
SETLOCAL EnableDelayedExpansion
set /P omg=Enter a value that contains an exclamation-point:
echo Traditional: %omg%
echo Alternative: !omg!
pause

0voto

data Points 889

Le caractère d'échappement normal est ^. Essayez-le avec ça.

Prograide.com

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.

Powered by:

X