Quand j'ai setlocal ENABLEDELAYEDEXPANSION
mis dans un script cmd est-il possible d'échapper à un! que je veux utiliser comme paramètre d'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^!
C'est ce que j'ai trouvé (^^)
@echo off
setlocal ENABLEDELAYEDEXPANSION
echo I want to go out with a bang^^!
Une remarque supplémentaire à la réponse de FrVaBe .
Normalement, ^^!
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^!"
Ceci est le résultat du mécanisme d'échappement de l'analyseur par lots.
Tout d'abord, l'analyseur analyse une ligne et le curseur échappe au caractère suivant, dans ce cas, il a un effet pour &|<>()"<linefeed>
, mais uniquement en dehors des guillemets, car à l'intérieur des guillemets, tous les caractères sont "normaux" et le caret lui-même n'a aucun effet.
Avec l'expansion retardée, une étape d'analyse supplémentaire suit, le signe d'insertion contient également un caractère d'échappement pour le caractère suivant, mais n'affecte que !
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 !
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!"
[~ # ~] modifier [~ # ~]
Voici un exemple légèrement modifié qui illustre mieux les différentes permutations d'échappement requises, 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 !
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^!"
- SORTIE -
DisableDelayedExpansion
caret^ "caret^"
caret^ bang! "caret^ bang!"
EnableDelayedExpansion
caret^ "caret^"
caret^ bang! "caret^ bang!"
Veuillez trouver ci-dessous l'exemple, sur la façon dont nous pouvons utiliser la variable de point d'exclamation dans DISABLEDELAYEDEXPANSION et ENABLEDELAYEDEXPANSION état.
@echo off
setlocal DISABLEDELAYEDEXPANSION
set DB_password=encrypt!Pws
echo %DB_password%
SETLOCAL ENABLEDELAYEDEXPANSION
echo !DB_password!
Merci. Pour ajouter à ce point précieux, si son script contient une variable dont la valeur contient un "!", L'approche suivante rendra cette valeur telle quelle:
@ echo off SETLOCAL EnableDelayedExpansion set/P omg = Entrez une valeur qui contient un point d'exclamation: echo Traditional:% omg% echo Alternative:! omg! pause