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

642

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

Je veux faire quelque chose comme:

echo hello\nworld

Ce qui produirait:

hello
world
Brian R. Bondy
la source
6
Entré utile pour moi. Je devais faire echo \ n \ n | my_app.exe dans un script. Je l'ai fait (écho. && écho.) | my_app.exe
Vignesh
2
Approche facile "Le code commence:"> echo hello & echo world, vous donnera ce dont vous
avez
1
Vous pouvez insérer un ascii chr invisible (255) sur une ligne séparée qui forcera une nouvelle ligne vierge. Maintenez la touche [alt] enfoncée et appuyez sur 255 sur le clavier. cela insère chr (255) qui est un carré vide. ie " echo (alt + 255) " Vous ne pouvez utiliser que le clavier et non les chiffres en haut du clavier querty!
jwzumwalt
Tout comme la moitié de la réparation informatique est de le brancher et de l'allumer, la moitié du développement logiciel est ce que j'appelle l'ingénierie spatiale . Nous avons juste besoin de nos lignes blanches.
Bob Stein
Que dis-tu de ça ? echo Yes&echo No
scientist_7

Réponses:

462

echo hello & echo.world

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

Grimtron
la source
43
l'exemple n'a pas besoin d'un point, mais vous en avez besoin pour faire écho à une ligne vide vide:echo. && echo hello && echo. && echo world
matt wilkie
4
Pouvez-vous le faire avec un seul écho afin qu'il puisse être redirigé vers un fichier?
Shahbaz
46
@Shahbaz -$ (echo Hello && echo World) > ./File.txt
Nathan JB
25
La chose période en "écho". ne cesse de me surprendre. C'est tellement daté, et j'oublie toujours que le point doit être strictement concaténé avec le nom de la commande, sans espace entre les deux. Il n'y a aucune erreur dans le message que vous m'écrivez, j'écris ceci juste pour vous rappeler: "écho" ! = "écho". !
quetzalcoatl
5
@quetzalcoatl, ça devient encore plus étrange. D'autres personnages que les points fonctionnent également. SS64 dit qu'une meilleure syntaxe est echo(pour de meilleures performances (toujours sans souci d'espace). Discussion approfondie sur d'autres personnages et leurs mérites / défauts chez ECHO. ÉCHEC pour donner du texte ou une ligne vierge - Utilisez plutôt ECHO /
matt wilkie
558

Utilisation:

echo hello
echo.
echo world
Matt Lacey
la source
16
Est-il possible en fournissant une chaîne dans une seule instruction d'écho?
Brian R. Bondy,
5
Pourquoi avez-vous besoin de le faire avec une seule instruction d'écho; où est le mal d'en avoir un autre?
Rob
3
@Rob, je viens de rencontrer ce problème et aucun de ces travaux. Vous devez faire écho dans une seule déclaration dans mon exemple. Je génère des fichiers tex à partir de HTML et je génère un Makefile à l'aide de echo "Makefile contents (which has \n)" > Makefileplusieurs échos, cela ne fonctionnerait pas
Shahbaz
3
Utilisez & (ou &&) pour les faire en une seule instruction: Par exemple, pour mettre "hello \ nworld" dans un fichier txt:(echo hello & echo world) >> ./test.txt
Ned Martin
4
Pour une sortie multiligne vers un fichier, pourquoi ne pas simplement faire ce qui suit? echo line 1 > Makefileet puis echo line 2 >> Makefile. L'utilisation de >>entraîne l'ajout de la sortie au fichier, ce qui correspond précisément au comportement dont vous avez besoin dans ce cas.
dgnuff
141

Voilà, 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 . . .

Évidemment, vous n'avez besoin que du code entre les instructions REM.

jeb
la source
51
Très impressionnant, pourriez-vous prendre le temps d'expliquer comment fonctionne l'ensemble de lignes NL = ^^^% NLM %% NLM% ^% NLM %% NLM%? Je n'arrive pas à comprendre
Andy Morris
8
@andy methinks un commentaire +8 mérite une question: stackoverflow.com/questions/6379619/…
matt wilkie
82
Ceci est un merveilleux exemple pour montrer que les fichiers batch cmd.exe et Windows sont totalement fous!
mivk
12
NOTE À SOI: La ligne "set NLM = ^" ne doit rien avoir après le CARET et doit avoir 2 lignes vides après.
mnemotronic
4
Voir ma réponse pour une méthode plus simple. set nl=^&echo., donne alors juste echo hello %nl% worldle même effet.
coltonon
96

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

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

Sortie du fichier cmd cité ci-dessus:

line1

line2
macropas
la source
37
En fait, tout caractère spécial NON UTILISÉ devrait fonctionner. J'encourage toujours l'utilisation de / car la barre oblique est le caractère standard pour les options de commande. De plus, je critique toujours l'utilisation du point que quelqu'un de Microsoft choisit malheureusement parce que la commande: echo.com donne des résultats différents selon la version du processeur de commandes MS-DOS / Windows Batch.
Aacini
21
La seule version qui fonctionne toujours est echo(. Il semble que cela pourrait causer des problèmes, mais cela fonctionne parfaitement. Tous les autres formulaires ont au moins une situation où la commande ne s'exécutera pas comme souhaité.
dbenham
5
@naxa - Rien d'officiel, juste des connaissances collectives dérivées de quelques hackers batch. Le but est d'avoir une syntaxe qui peut être utilisée pour ECHO n'importe quelle valeur, y compris rien, et ne jamais avoir à se soucier d'obtenir autre chose que ce qui est attendu. Le meilleur résumé que je connaisse est sur dostips.com/forum/viewtopic.php?p=4554#p4554 . Cela vous laisse en quelque sorte suspendu, mais personne n'a jamais proposé un scénario où il ECHO(échoue.
dbenham
2
@Pacerier - il y a des exemples d'échec pour chacune de ces suggestions. Lisez attentivement dostips.com/forum/viewtopic.php?p=4554#p4554 .
dbenham
2
@Pacerier il y a assez d' écho ici pour une question autonome. Peut-être quelque chose dans le sens de "quels personnages peuvent suivre immédiatement echo, et quels sont leurs effets?"
matt wilkie
68

Comme la réponse de Ken, mais avec l'utilisation de l'expansion 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 affecté à la variable \ n.
Cela fonctionne comme le signe d'insertion à la fin de la ligne tente d'échapper le 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).
Ensuite, vous avez besoin d'un troisième saut de ligne pour terminer l'instruction en cours, sinon la troisième ligne serait ajoutée à la variable LF.
Même les fichiers batch ont des fins de ligne 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 pas du tout de gestion de caractères spéciaux.
echo Line1%LF%Line2échouerait, car l'analyseur arrête l'analyse à des sauts de ligne uniques.

Plus d'explications sont disponibles sur
SO: Les commandes longues sont réparties sur plusieurs lignes dans le fichier batch Vista / DOS (.bat)
SO: Comment le Windows Command Interpreter (CMD.EXE) analyse-t-il les scripts?

Modifier: éviter echo.

Cela ne répond pas à la question, car la question portait sur une seule echoqui peut produire 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.c'est le pire, car il est très lent et peut complètement échouer, car cmd.exe recherche un fichier nommé ECHOet essaie de le démarrer.

Pour imprimer uniquement une ligne vide, vous pouvez utiliser

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

Mais l'utilisation de echo., echo\ou echo:devrait être évitée, car ils peuvent être très lents, en fonction de l'emplacement où le script sera exécuté, comme un lecteur réseau.

jeb
la source
1
Si vous transmettez la chaîne avec des sauts de ligne en tant que paramètre à un sous-programme batch, par exemple call :pause line1!\n!line2, démarrez le sous-programme avec setlocal EnableDelayedExpansionet terminez-le avec setlocal DisableDelayedExpansionpour éviter que les sauts de ligne ne soient interprétés prématurément.
stevek_mcc
2
+1 pour le casting de personnages echo, echo; echo( echo/ echo+ echo=et la galerie des voleurs echo. echo\ echo:. Maintenant, si vous deviez expliquer pourquoi diable ces travaux, je vous devrais une bière gratuite.
Bob Stein
40

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, dites que vous voulez quelque chose d'un peu plus chic, ...

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

Les sorties

hello
world

Ensuite, ajoutez simplement un %n%chaque fois que vous voulez une nouvelle ligne dans une instruction echo. C'est plus proche de votre \nutilisé dans différentes langues.

Panne

set n=définit la variable négale à:

^ Annule le prochain symbole à suivre:

&Signifie 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 à haute voix), donc aucun &&n'est nécessaire.

echo. Continue l'instruction d'écho.

Tout cela fonctionne parce que 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 ghetto, car batch n'est pas exactement le plus avancé des langages de script shell. Cela ne fonctionne que parce que le lot utilise mal les variables, ne désignant pas naturellement les entiers, les caractères, les flottants, les chaînes, etc.

Si vous êtes rusé, vous pourriez faire fonctionner cela avec d'autres choses. Par exemple, l'utiliser pour faire écho à un onglet

set t=^&echo.     ::there are spaces up to the double colon
coltonon
la source
7
Ne l' utilisez pasecho. lors de sa première tentative de recherche d'un fichier portant ce nom. Utilisez d'autres signes de ponctuation, tels queecho,
Rétablir Monica
20

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

écho bonjour> temp
echo world >> temp
Crend King
la source
8
Le premier exemple, en utilisant ">", créera un nouveau fichier, le second, en utilisant ">>", s'ajoutera à un fichier existant (ou le créera s'il n'existe pas déjà).
Yann Duran
1
(echo hello && echo world) > tempmentionné par Nathan J. Brauer dans un commentaire aux travaux de réponse acceptés (actuels).
GeroldBroser réintègre Monica le
15

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

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

Production

C:\>test.bat
hello
world
Peter Mortensen
la source
Il fera en fait écho à une nouvelle ligne supplémentaire après "world"
BlueRaja - Danny Pflughoeft
1
@blue, la nouvelle ligne de fin semble être fonction du fichier batch lui-même. Si vous répétez la echo hello %newline%worldligne, il n'y a pas d'espace entre les deux.
matt wilkie
2
echo "Hello %newline% world"échoue car il est à l'intérieur des guillemets. Parce que ce n'est pas une vraie nouvelle ligne.
jeb
14

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

(echo a & echo. & echo b) > file_containing_multiple_lines.txt
test30
la source
9

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)
Albert
la source
Cette solution fonctionne également si vous souhaitez faire écho à une esperluette & au lieu d'une nouvelle ligne.
parvus
Je pense que je l' ai trouvé un bug: l' *omble chevalier
7

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

@cmd /c echo.

simplement en utilisant echo.provoque le process_begin: CreateProcess(NULL, echo., ...) failed.message d'erreur redouté .

J'espère que cela aide au moins une autre personne là-bas :)

Wayne Uroda
la source
Mais ce n'est pas la question. Downvote!
Mesalcode
Je ne sais pas si le sarcasme ou non: P
Wayne Uroda
Découvrez-le en regardant dans votre boîte de réception: D
Mesalcode
3

Si l'on a besoin d'utiliser des \ n célèbres dans des littéraux de chaîne qui peuvent être passés à une variable, on peut écrire un code comme dans le 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 conservé dans la variable de nouvelle ligne . Sa valeur doit être remplacée après que la ligne d' écho soit développée, 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 remplace \ n par un contenu de nouvelle ligne (recherchez la syntaxe dans le jeu d'aide ). Nous pourrions bien sûr utiliser ! Newline! lors de la définition de la réponse, mais \ n est plus pratique. Il peut être passé de l'extérieur (essayez Hello R2 \ nD2 ), où personne ne connaît le nom de la variable contenant le saut de ligne (Oui, Hello 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.

Tomate
la source
1
Vous faites essentiellement la même chose que la réponse de Jeb ci-dessus.
Squashman
Les réponses que j'ai lues ci-dessus ont été très utiles, mais j'avais besoin d'appeler un sous-programme de script od qui analysera \ n, donc j'éviterais d'implémenter l'astuce partout. Cela devait affiner une solution et j'ai partagé ce raffinement. J'espère que cela n'a fait de mal à aucun animal.
Tomator
2

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 une sortie comme ceci:

<html>
<body>
Hello
</body>
</html>
Press any key to continue . . .
NahuelGQ
la source
4
-1 echo asdf >myfile.txtproduira exactement les mêmes résultats. echoajoute une nouvelle ligne à la fin de la chaîne.
BlueRaja - Danny Pflughoeft
2
Excellente réponse, étant la seule personne qui a reconnu la valeur de l'utilisation des parenthèses pour les nouvelles lignes. Je pense que c'est ainsi que les fabricants de DOS vous ont proposé de le faire.
djangofan
2

Pour démarrer une nouvelle ligne en batch, il vous suffit d'ajouter "echo [", comme ceci:

echo Hi!
echo[
echo Hello!
PryroTech
la source
5
C'est lent et ça échoue quand un fichier existe avec le nomecho[.bat
jeb
Quelle? Cela devrait fonctionner instantanément, et aussi simplement supprimer le fichier echo [.bat.
PryroTech
2
C'est à peu près exactement la même chose que l'écho. syntaxe.
PryroTech
5
Oui et echo.c'est aussi une mauvaise solution.
jeb
1
Comme on peut le voir dans les réponses précédentes, cela essaiera d'abord de localiser un fichier sur le chemin, ce qui le rend si lent. C'est la même chose pour echo.. Attendre des utilisateurs de votre script qu'ils suppriment des fichiers sur leur système simplement parce que votre script a besoin d'une nouvelle ligne ne me semble pas être une bonne conception.
Abel
2

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
otaviodecampos
la source
0

Vous pouvez utiliser @echo(@echo + [espace] + [espace insécable])

Remarque: l'espace insécable peut être obtenu avec Alt + 0160

J'espère que cela aide :)

[edit] Hmm tu as raison, j'en avais besoin dans un Makefile, ça marche parfaitement dedans. Je suppose que ma réponse n'est pas adaptée pour les fichiers batch ... Mon mauvais.

johan d
la source
Je n'ai ECHO ist eingeschaltet (ON).pas de ligne vide, j'ai essayé à l'invite cmd
jeb
1
C'est un espace insécable, pas une nouvelle ligne.
Ry-
0

Cette solution fonctionne (testée):

type nul | more /e /p

Cela convertit les sauts de ligne isolés en combinaison de sauts de ligne de retour chariot.

Wasif Hasan
la source
Mais comment cela ajoute une nouvelle ligne entre un texte? La question est à proposecho hello \n world
jeb
Downvote de moi. Ce n'est pas une réponse à la question
Mesalcode
-2

Je ne peux pas faire plus simple que:

echo echo hello^&echo world^&pause>silly.bat                       
call silly.bat
strance
la source