Comment pouvez-vous faire écho à une nouvelle ligne dans les fichiers de commandes?

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

Je veux faire quelque chose comme:

> echo hello\nworld

Qui produirait:

Bonjour
monde

echo hello & echo.world

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

Utilisation:

 echo hello echo. echo world 

Ici, vous créez un fichier .bat avec ce qui suit:

 @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 la sortie comme suit:

 There should be a newline inserted here. Press any key to continue . . . 

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

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

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

Sortie du fichier cmd ci-dessus:

 line1 line2 

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 caractère de saut de ligne est créé et affecté à la variable \ n.
Cela fonctionne comme le curseur à la fin de la ligne tente 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 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 de commandes ont des fins de ligne avec CR / LF, seul le LF est important, car les CR sont supprimés dans cette phase de l’parsingur.

L’avantage d’utiliser l’extension retardée est qu’il n’y a pas de traitement spécial des caractères.
echo Line1%LF%Line2 échouerait, car l’parsingur arrête l’parsing à un seul saut de ligne.

Plus d’explications sont à
SO: commandes longues réparties sur plusieurs lignes dans un fichier batch (.bat) Vista / DOS
SO: Comment l’interpréteur de commandes Windows (CMD.EXE) parsing-t-il les scripts?

Edit: Évitez l’ echo.

Cela ne répond pas à la question, car la question concernait l’ echo simple pouvant générer plusieurs lignes.

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

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

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

Mais l’utilisation de l’ echo. , echo\ ou echo: doit être évité, car il peut être très lent, selon l’emplacement où le script sera exécuté, comme un lecteur réseau.

echo. Assez dit.

Si vous en avez besoin dans 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, lancez un %n% chaque fois que vous voulez une nouvelle ligne dans une déclaration echo. Ceci est plus proche de votre \n utilisé dans diverses langues.

Panne

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

^ Nulls le prochain symbole à suivre:

& Moyens de faire une autre commande sur la même ligne. Nous ne nous soucions pas de errorlevel (c’est une déclaration d’écho pour crier fort), donc pas de && est nécessaire.

echo. Continue la déclaration d’écho.

Tout cela fonctionne parce que vous pouvez réellement créer des variables qui sont du code et les utiliser à l’intérieur d’autres commandes. C’est un peu comme une fonction ghetto, puisque batch n’est pas exactement le langage de script shell le plus avancé. Cela ne fonctionne que parce que la mauvaise utilisation des variables par lots, ne désignant pas naturellement les ints, les chars, les flottants, les chaînes, etc.

Si vous êtes rusé, vous pourriez faire en sorte que cela fonctionne avec d’autres choses. Par exemple, l’utiliser pour faire écho à un onglet

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

Lorsque vous faites écho à quelque chose pour redirect vers un fichier, plusieurs commandes d’écho ne fonctionneront pas. Je pense que le redirecteur “>>” est un bon choix:

 echo hello> temp
 echo world >> temp

Tout 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 

Si vous avez besoin de mettre des résultats dans un fichier, vous pouvez utiliser

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

Vous pouvez aussi faire comme ça,

 (for %i in (ab "cd") do @echo %~i) 

La sortie sera,

 a b cd 

Notez que lorsque ceci est placé dans un fichier de commandes, «%» doit être doublé.

 (for %%i in (ab "cd") do @echo %%~i) 

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

@cmd /c echo.

simplement en utilisant l’ echo. provoque le process_begin: CreateProcess(NULL, echo., ...) failed. redouté process_begin: CreateProcess(NULL, echo., ...) failed. Message d’erreur.

J’espère que cela aide au moins une autre personne là-bas 🙂

Pour démarrer une nouvelle ligne en batch, il suffit d’append “echo [“, comme ceci:

 echo Hi! echo[ echo Hello! 

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

 @echo off ( echo ^ echo ^ echo Hello echo ^ echo ^ ) pause 

Il écrit une sortie comme ceci:

   Hello   Press any key to continue . . . 

Les solutions Ken et Jeb fonctionnent bien.

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

À 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 

Si vous devez utiliser des littéraux \ n in ssortingng célèbres pouvant être transmis à une variable, vous pouvez é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 dans un autre.

Le saut de ligne est contenu dans la variable newline . Sa valeur doit être remplacée après l’extension de la ligne d’ écho . J’utilise donc setlocal enableDelayedExpansion pour activer les signes d’exclamation qui développent les variables à l’exécution. Et l’exécution remplace \ n par le contenu de la nouvelle ligne (recherchez la syntaxe à l’ aide définie ). Nous pourrions bien sûr utiliser ! Newline! en définissant 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 qui contient 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 

Notez que cette barre oblique supplémentaire n’empêche pas le script d’parsingr \ n la sous-chaîne.

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

Note: 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 là-dedans. Je suppose que ma réponse n’est pas adaptée pour les fichiers de commandes … Mon mauvais.

Je ne peux pas faire plus simple que:

 echo echo hello^&echo world^&pause>silly.bat call silly.bat 

La méthode la plus conservasortingce pour accomplir cela dans les systèmes Linux est l’alias -e – qui interprète les caractères échappés qui sont barrés.

 echo -e "hello\nworld" 

Voici d’autres exemples