web-dev-qa-db-fra.com

Comment puis-je faire écho une nouvelle ligne dans un fichier batch?

Comment pouvez-vous insérer une nouvelle ligne à partir de la sortie de votre fichier de commandes?

Je veux faire quelque chose comme:

echo hello\nworld

Ce qui donnerait:

hello
world
592
Brian R. Bondy

echo hello & echo.world

Cela signifie que vous pouvez définir & echo. comme une constante pour une nouvelle ligne \n.

433
Grimtron

Utilisation:

echo hello
echo.
echo world
521
Matt Lacey

Ici, créez un fichier .bat contenant les éléments suivants:

@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.

echo.
pause

Vous devriez voir une sortie comme celle-ci:

There should be a newline
inserted here.

Press any key to continue . . .

Vous n'avez évidemment besoin que du code entre les instructions REM.

131
Ken

Il existe une fonctionnalité standard echo: dans cmd/bat-files pour écrire une ligne vierge, qui émule une nouvelle ligne dans votre sortie de cmd:

@echo off
@echo line1
@echo:
@echo line2

Sortie du fichier cmd cité ci-dessus:

line1

line2
93
macropas

Comme la réponse de Ken, mais avec l'utilisation de l'extension retardée.

setlocal EnableDelayedExpansion
(set \n=^
%=Do not remove this line=%
)

echo Line1!\n!Line2
echo Works also with quotes "!\n!line2"

Tout d'abord, un seul caractère de saut de ligne est créé et attribué à la variable\n.
Ceci fonctionne lorsque le curseur inséré à la fin de la ligne essaie d’échapper au caractère suivant, mais s’il s’agit d’un saut de ligne, il est ignoré et le caractère suivant est lu et échappé (même s’il s’agit également d’un saut de ligne).
Vous avez ensuite besoin d’un troisième saut de ligne pour mettre fin à l’instruction en cours, sinon la troisième ligne serait ajoutée à la variable LF.
Même les fichiers de commandes ont des fins de lignes avec CR/LF; seuls les LF sont importants, car les CR sont supprimés dans cette phase de l'analyseur.

L'avantage d'utiliser l'extension retardée est qu'il n'y a aucune gestion des caractères spéciaux.
echo Line1%LF%Line2 échouerait, car l'analyseur arrêterait l'analyse à des sauts de ligne uniques.

Plus d'explications sont à
SO: commandes longues divisées en plusieurs lignes dans un fichier de traitement par lots Vista/DOS (.bat)
SO: Comment l’interprète de commandes Windows (CMD.EXE) analyse-t-il les scripts?

Modifier: éviter echo.

Cela ne répond pas à la question, car celle-ci concernait un seul echo pouvant générer plusieurs lignes.

Mais malgré les autres réponses qui suggèrent l'utilisation de echo. pour créer une nouvelle ligne, il convient de noter que echo. est le pire, car il est très lent et peut complètement échouer, car les recherches de cmd.exe pour un fichier nommé ECHO et essayez de le démarrer.

Pour imprimer uniquement une ligne vide, vous pouvez utiliser l'un des

echo,
echo;
echo(
echo/
echo+
echo=

Toutefois, il convient d'éviter l'utilisation de echo., echo\ ou echo:, car ils peuvent être très lents, en fonction de l'emplacement où le script sera exécuté, comme un lecteur réseau.

60
jeb

echo. Assez dit.

Si vous en avez besoin sur une seule ligne, utilisez le &. Par exemple,

echo Line 1 & echo. & echo line 3

produirait comme:

Line 1

line 3

Maintenant, disons que vous voulez quelque chose d'un peu plus sophistiqué, ...

set n=^&echo.
echo hello %n% world

Les sorties

hello
world

Ensuite, ajoutez simplement %n% à chaque fois que vous souhaitez insérer une nouvelle ligne dans une instruction echo. Ceci est plus proche de votre \n utilisé dans différentes langues.

Ventilation

set n= définit la variable n sur:

^ Supprime le prochain symbole à suivre:

& veut dire faire une autre commande sur la même ligne. Nous ne nous soucions pas du niveau d'erreur (c'est une déclaration d'écho pour crier fort), donc aucun && n'est nécessaire.

echo. Continue l'instruction echo.

Tout cela fonctionne car vous pouvez réellement créer des variables qui sont du code et les utiliser dans d'autres commandes. C'est un peu comme une fonction du ghetto, puisque batch n'est pas exactement le langage de script le plus avancé. Cela ne fonctionne que parce que le lot utilise mal les variables, ne désignant pas naturellement entre ints, chars, float, strings, etc.

Si vous êtes malin, vous pouvez le faire fonctionner avec d’autres choses. Par exemple, l'utiliser pour faire écho à un onglet

set t=^&echo.     ::there are spaces up to the double colon
37
coltonon

Lors de l'écho d'un élément à rediriger vers un fichier, plusieurs commandes d'écho ne fonctionneront pas. Je pense que le redirecteur ">>" est un bon choix:

 echo bonjour> temp 
 eco world >> temp 
19
Crend King

Comme Grimtron le suggère - voici un exemple rapide pour le définir:

@echo off
set newline=^& echo.
echo hello %newline%world

Sortie

C:\>test.bat
hello
world
15
user287293

Si vous devez mettre les résultats dans un fichier, vous pouvez utiliser

(echo a & echo. & echo b) > file_containing_multiple_lines.txt
13
test30

Vous pouvez aussi faire comme ça,

(for %i in (a b "c d") do @echo %~i)

La sortie sera,

a
b
c d

Notez que lorsque cela est placé dans un fichier de commandes, '%' doit être doublé.

(for %%i in (a b "c d") do @echo %%~i)
9
albert

Si quelqu'un vient ici parce qu'il cherche à faire écho à une ligne vierge d'un makefile MINGW, j'ai utilisé

@cmd /c echo.

le simple fait d'utiliser echo. provoque le message d'erreur redouté process_begin: CreateProcess(NULL, echo., ...) failed..

J'espère que cela aide au moins une autre personne :)

6
Wayne Uroda

Pour commencer une nouvelle ligne en batch, tout ce que vous avez à faire est d’ajouter "echo [", comme ceci:

echo Hi!
echo[
echo Hello!
3
PryroTech

Les solutions Ken et Jeb fonctionnent bien.

Mais les nouvelles lignes sont générées avec uniquement un caractère LF et j'ai besoin de caractères CRLF (version Windows).

Pour cela, à la fin du script, j'ai converti LF en CRLF.

Exemple:

TYPE file.txt | FIND "" /V > file_win.txt
del file.txt
rename file_win.txt file.txt
2
otaviodecampos

Cela a fonctionné pour moi, aucune expansion retardée nécessaire:

@echo off
(
echo ^<html^> 
echo ^<body^>
echo Hello
echo ^</body^>
echo ^</html^>
)
pause

Il écrit la sortie comme ceci:

<html>
<body>
Hello
</body>
</html>
Press any key to continue . . .
2
NahuelGQ

Si vous devez utiliser des\n dans les littéraux de chaîne connus pouvant être passés à une variable, vous pouvez écrire un code similaire au script Hello.bat ci-dessous:

@echo off
set input=%1
if defined input (
    set answer=Hi!\nWhy did you call me a %input%?
) else (
    set answer=Hi!\nHow are you?\nWe are friends, you know?\nYou can call me by name.
)

setlocal enableDelayedExpansion
set newline=^


rem Two empty lines above are essential
echo %answer:\n=!newline!%

De cette façon, la sortie multiligne peut être préparée à un endroit, même dans un autre fichier scritpt ou externe, et imprimée à un autre.

Le saut de ligne est maintenu dans la variable newline . Sa valeur doit être substituée après la ligne echo est étendue, donc j'utilise setlocal enableDelayedExpansion pour activer les signes d'exclamation qui développent les variables lors de l'exécution. Et l'exécution substitue \n avec newline contenu (recherchez la syntaxe à ensemble d'aide ). Nous pourrions bien sûr utiliser ! Newline! tout en définissant la réponse mais \n est plus pratique. Il peut être passé de l’extérieur (try Hello R2\nD2 ), où personne ne connaît le nom de la variable qui contient le saut de ligne (Oui, Bonjour C3! Newline! P0 fonctionne de la même manière).

L'exemple ci-dessus peut être affiné en un sous-programme ou un lot autonome, utilisé comme call:mlecho Hi\nI'm your comuter:

:mlecho
setlocal enableDelayedExpansion
set text=%*
set nl=^


echo %text:\n=!nl!%
goto:eof

Veuillez noter que la barre oblique inverse supplémentaire n’empêchera pas le script d’analyser la sous-chaîne\n.

2
Tomator

Vous pouvez utiliser @echo (@echo + [espace] + [espace insecable])

Remarque: L’espace insécable peut être obtenu avec Alt + 0160

J'espère que ça aide :)

[modifier] Hmm tu as raison, j'en avais besoin dans un Makefile, ça marche parfaitement là-dedans. J'imagine que ma réponse n'est pas adaptée aux fichiers de commandes ... Mon mauvais.

0
johan d.