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
echo Yes&echo No
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
echo Yes&echo No
Réponses:
echo hello & echo.world
Cela signifie que vous pouvez définir & echo.
une constante pour une nouvelle ligne \n
.
echo. && echo hello && echo. && echo world
$ (echo Hello && echo World) > ./File.txt
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 /
Utilisation:
echo hello
echo.
echo world
echo "Makefile contents (which has \n)" > Makefile
plusieurs échos, cela ne fonctionnerait pas
(echo hello & echo world) >> ./test.txt
echo line 1 > Makefile
et 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.
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.
set nl=^&echo.
, donne alors juste echo hello %nl% world
le même effet.
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
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é.
ECHO(
échoue.
echo
, et quels sont leurs effets?"
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 echo
qui 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é ECHO
et 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.
call :pause line1!\n!line2
, démarrez le sous-programme avec setlocal EnableDelayedExpansion
et terminez-le avec setlocal DisableDelayedExpansion
pour éviter que les sauts de ligne ne soient interprétés prématurément.
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.
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 \n
utilisé 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
echo.
lors de sa première tentative de recherche d'un fichier portant ce nom. Utilisez d'autres signes de ponctuation, tels queecho,
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
(echo hello && echo world) > temp
mentionné par Nathan J. Brauer dans un commentaire aux travaux de réponse acceptés (actuels).
Comme le suggère Grimtron - voici un exemple rapide pour le définir:
@echo off
set newline=^& echo.
echo hello %newline%world
C:\>test.bat
hello
world
echo hello %newline%world
ligne, il n'y a pas d'espace entre les deux.
echo "Hello %newline% world"
échoue car il est à l'intérieur des guillemets. Parce que ce n'est pas une vraie nouvelle ligne.
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)
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 :)
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.
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 . . .
echo asdf >myfile.txt
produira exactement les mêmes résultats. echo
ajoute une nouvelle ligne à la fin de la chaîne.
Pour démarrer une nouvelle ligne en batch, il vous suffit d'ajouter "echo [", comme ceci:
echo Hi!
echo[
echo Hello!
echo[.bat
echo.
c'est aussi une mauvaise solution.
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.
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
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.
ECHO ist eingeschaltet (ON).
pas de ligne vide, j'ai essayé à l'invite cmd
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.
echo hello \n world