web-dev-qa-db-fra.com

Différence entre% variable% et! Variable! dans un fichier batch

J'écris un fichier batch où j'ai besoin de sortir une chaîne contenant '!' vers un autre fichier. Mais quand je fais écho à cette chaîne dans un autre fichier, elle supprime "!" de la sortie.

Par exemple: Entrée:

set LINE=Hi this is! output
echo !LINE!>>new_file.txt

La sortie dans new_file.txt est:

Hi this is output

De plus, si l'entrée est

set LINE=Hello!! this is output!!
echo !LINE!>>new_file.txt

Sortie dans new_file.txt:

Hello

Par conséquent, il saute le! (Point d'exclamation) de la sortie vers le nouveau_fichier. Si j'utilise% LINE%, il affiche simplement "l'écho est activé" dans le fichier de sortie.

Veuillez suggérer un moyen de résoudre ce problème.

26
Vishal

Si vous avez activé l'expansion différée et souhaitez afficher un point d'exclamation, vous devez y échapper.

L'échappement des points d'exclamation ne nécessite aucun, un ou deux carets, selon l'emplacement.

@echo off
set test1=Test1!
setlocal EnableDelayedExpansion
set test2=Test2^^!
set "test3=Test3^!"

echo !test1!
echo !test2!
echo !test3!

La différence entre !var! et %var% dans les blocs est expliqué à batch DOS: pourquoi mes commandes set ne produisent-elles rien de stocké?

Une explication de l'analyseur par lots peut être trouvée à Comment les scripts d'analyse des commandes Windows (CMD.EXE)?

18
jeb

Il semble que vous ayez appelé SETLOCAL EnableDelayedExpansion quelque part plus haut dans le code. Jetez un oeil ici pour voir quels en sont les effets.

6
Ivaylo Strandjev