web-dev-qa-db-fra.com

en utilisant l'écho de lot avec des caractères spéciaux

C’est peut-être très facile, mais il n’ya pas eu de réponse sur Internet. Je souhaite faire écho d'une ligne XML via batch dans un fichier, mais la balise de fermeture XML est mal comprise pour la redirection ">". La ligne est la suivante:

echo <?xml version="1.0" encoding="utf-8" ?> > myfile.xml

est-il possible d'indiquer à l'analyseur de lot de ne pas interpréter une chaîne spéciale? J'ai utilisé des guillemets doubles mais il les écrit également dans le fichier! Le fichier devrait ressembler à ceci après écho:

<?xml version="1.0" encoding="utf-8" ?>
56
Amir Zadeh

Vous pouvez échapper aux métacaractères Shell avec ^:

echo ^<?xml version="1.0" encoding="utf-8" ?^> > myfile.xml

Notez que, étant donné que echo est un shell intégré, il ne suit pas les conventions habituelles concernant la citation. Il suffit donc de citer l'argument pour afficher les guillemets au lieu de les supprimer.

86
Joey

Pour utiliser des caractères spéciaux, tels que '>' sous Windows avec écho, vous devez placer un caractère d'échappement spécial devant celui-ci. 

Par exemple 

echo A->B

ne fonctionnera pas car '>' doit être échappé par '^':

 echo A-^>B

Voir aussi séquences d'échappement .  enter image description here

Il existe un fichier de commandes court qui imprime un ensemble de base de caractères spéciaux et leurs séquences d'échappement.

18
orbitcowboy

une autre méthode:

@echo off

for /f "useback delims=" %%_ in (%0) do (
  if "%%_"=="___ATAD___" set $=
  if defined $ echo(%%_
  if "%%_"=="___DATA___" set $=1
)
pause
goto :eof

___DATA___
<?xml version="1.0" encoding="utf-8" ?>
 <root>
   <data id="1">
      hello world
   </data>
 </root>
___ATAD___


rem # 
rem # 
17
walid2mi

Une solution simple consiste à utiliser l’extension différée, car cela ne modifie aucun caractère spécial.

set "line=<?xml version="1.0" encoding="utf-8" ?>"
setlocal EnableDelayedExpansion
(
  echo !line!
) > myfile.xml

EDIT: Une autre solution consiste à utiliser un guillemet disparaissant .

Cette technique utilise un guillemet pour citer les caractères spéciaux

@echo off
setlocal EnableDelayedExpansion
set ""="
echo !"!<?xml version="1.0" encoding="utf-8" ?>

L'astuce fonctionne, car dans la phase des caractères spéciaux, le guillemet de tête dans !"! préservera le reste de la ligne (s'il n'y a pas d'autres guillemets).
Et dans la phase d'expansion retardée, le !"! sera remplacé par le contenu de la variable " (une citation unique est un nom légal!).

Si vous travaillez avec une expansion retardée désactivée, vous pouvez utiliser une boucle FOR /F.

for /f %%^" in ("""") do echo(%%~" <?xml version="1.0" encoding="utf-8" ?>

Mais comme cela semble un peu gênant, vous pouvez également créer une macro.

set "print=for /f %%^" in ("""") do echo(%%~""

%print%<?xml version="1.0" encoding="utf-8" ?>
%print% Special characters like &|<>^ works now without escaping
16
jeb

Pour sortir le caractère >, vous devez l'ajouter au caractère d'échappement ^:

echo ^>

imprimera simplement

>
10
Aleks G

La réponse de Joey ne fonctionnait pas pour moi. Après avoir exécuté 

  echo ^<?xml version="1.0" encoding="utf-8" ?^> > myfile.xml

J'ai eu cette erreur Bash: erreur de syntaxe près du jeton inattendu `> '

Cette solution a fonctionné pour moi:

 echo "<?xml version=\"1.0\" encoding=\"utf-8\">" > myfile.txt

Voir aussi http://www.robvanderwoude.com/escapechars.php

2
Competo

Pourquoi ne pas utiliser un seul devis?

echo '<?xml version="1.0" encoding="utf-8" ?>'

sortie

<?xml version="1.0" encoding="utf-8" ?>
0
fangxing