Question

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

Quel serait le résultat:

hello
world
Était-ce utile?

La solution

echo hello & amp; echo.world

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

Autres conseils

Utiliser:

echo hello
echo.
echo world

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 les résultats 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 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

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 \ n-variable.
Cela fonctionne lorsque le curseur inséré à 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 é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 de commandes ont des fins de lignes avec CR / LF. Seuls les LF sont importants, car les CR sont supprimés au cours de cette phase de l'analyseur.

L’avantage de l’extension différée est qu’il n’existe aucune gestion des caractères spéciaux.
echo Line1% LF% Line2 échouerait, car l'analyseur arrêterait l'analyse à un seul saut de ligne.

Plus d'explications sont à
SO: commandes longues fractionné sur plusieurs lignes dans un fichier de traitement par lots (.bat) Vista / DOS
SO: Comment l'interpréteur de commandes Windows (CMD.EXE) des scripts d'analyse?

Modifier: évitez écho.

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 suggérant 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 cela peut complètement échouer, car cmd.exe recherche un fichier nommé ECHO et tente de le démarrer.

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

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

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

echo. Assez parlé.

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

echo Line 1 & echo. & echo line 3

afficherait en tant que:

Line 1

line 3

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

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

Sorties

hello
world

Ajoutez simplement un % n% chaque fois que vous souhaitez 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:

& amp; Permet d'effectuer une autre commande sur la même ligne. Nous nous moquons du niveau d'erreur (il s'agit d'une déclaration d'écho pour crier fort), donc aucun & amp; & amp; 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 shell le plus avancé. Cela ne fonctionne que parce que les lots utilisent mal les variables, sans désignation naturelle entre les entiers, les caractères, les flottants, les chaînes, etc. naturellement.

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

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

echo hello > temp
echo world >> temp

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 devez placer les 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 (a b "c d") do @echo %~i)

Le résultat 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)

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

@cmd / c echo.

utiliser simplement echo. provoque l'échec du processus_ redouté: CreateProcess (NULL, echo., ...) a échoué. message d'erreur.

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

Pour commencer une nouvelle ligne par lot, il vous suffit d'ajouter "echo [", comme suit:

echo Hi!
echo[
echo Hello!

Cela a fonctionné pour moi, aucune expansion différé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 . . .

Les solutions Ken et Jeb fonctionnent bien.

Mais les nouvelles lignes sont générées avec seulement 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

S'il est nécessaire d'utiliser des \ n littéraux de chaîne réputés pouvant être transmis à 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 manière, 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 étant développée, j'utilise donc setlocal enableDelayedExpansion pour activer les signes d'exclamation qui développent les variables lors de l'exécution. Et l’exécution substitue \ n au contenu newline (recherchez la syntaxe dans help set ). 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 contenant 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 , appelez: mlecho Salut \ nJe suis votre ordinateur :

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

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

Remarque: vous pouvez obtenir l’espace insécable 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. Je suppose que ma réponse n’est pas adaptée aux fichiers de traitement par lots. Mon mauvais.

Je ne peux pas en faire plus simple que:

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

La manière la plus conservatrice de procéder à cette opération dans les systèmes Linux consiste à utiliser l'alias -e , qui interprète les caractères d'échappement qui sont inversés.

echo -e "hello\nworld"

Voici d'autres exemples

.
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top