78 votes

Expliquer le fonctionnement du hack variable de nouvelle ligne dos-batch

Quelqu'un peut-il s'il vous plaît expliquer comment cela fonctionne?

 @echo off
REM Creating a Newline variable (the two blank lines are required!)
set NLM=^


set NL=^^^%NLM%%NLM%^%NLM%%NLM%
REM Example Usage:
echo There should be a newline%NL%inserted here.
 

émet:

 There should be a newline
inserted here.
 

Comment pouvez-vous faire écho une nouvelle ligne dans les fichiers batch?

99voto

jeb Points 26035

L'astuce d'utiliser le comportement de l'accent circonflexe.
Aussi expliqué à Long commandes réparties sur plusieurs lignes dans Vista/DOS batch (.chauve-souris) fichier

Le signe est un caractère d'échappement pour le caractère suivant, ou à l'extrémité de la ligne, il est utilisé comme multiligne caractère, mais c'est presque la même.

À l'extrémité de la ligne de simplement s'échappe le caractère suivant, et dans ce cas, l' <Linefeed>, mais il y a une fonctionnalité cachée, de sorte que si le caractère d'échappement est un <LF> il est ignoré et le caractère suivant est lu et s'est échappé, mais ce personnage sera toujours échappé, même si c'est aussi un <LF>.

Maintenant vous pouvez comprendre

set NLM=^


rem Two empty lines are required here

La NLM-Variable contient exactement un <LF>caractère Mais si vous essayez de l'utiliser avec echo Line1%NLM%Line2 il échoue, que l'analyseur s'arrête l'analyse à un seul <LF>.
Mais cela fonctionne

echo Line1^

Line2

Si vous avez besoin d'ajouter un échappé de saut de ligne dans la ligne, et qui est le NL-Variable. Le NL-Variable se compose de seulement trois caractères.
NL=^<LF><LF> Et si cela est élargi crée un seul s'échappe <LF> comme le premier <LF> après le signe sera ignoré.

Btw. À mon avis, il est beaucoup plus facile d'utiliser des sauts de ligne avec l'expansion retardée, comme il n'est pas nécessaire pour échapper à quoi que ce soit.

setlocal EnableDelayedExpansion
set NLM=^


echo Line1!NLM!Line2

EDIT: Ajout de certains conseils utiles à l'aide de l' <LF>

1) l'Utiliser comme retour à la ligne dans un echo

setlocal EnableDelayedExpansion
set LF=^


echo Line1!LF!Line2

2) l'Utiliser pour diviser les commandes dans une parenthèse bloc

setlocal EnableDelayedExpansion
set LF=^


(
    echo Line1%LF%set x=4%LF%echo !x!%LF%
)

3) Créer un (presque) vides en fin de vie-chararcter dans un FOR /F en boucle, en tant que <LF> est le séparateur de ligne une EOL <LF> est le même que le vide.

FOR /F ^"eol^=^

delims^=^" %%a in (myFile.php) do echo %%a

4) Utilisation de la LF pour le fractionnement du texte dans un FOR /F en boucle

setlocal EnableDelayedExpansion
set LF=^


rem ** Two empty lines required
set "var=Content1;Content2"
FOR /F "delims=" %%a in ("%var:;=!LF!%") do (
  echo %%a
)

5voto

bill Points 21

Il semble y avoir un moyen qui fonctionne aussi avec pipe:

 (echo 1st line^
&echo 2nd line) | sort
 

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