Jak mogę powtórzyć nowy wiersz w pliku wsadowym?


641

Jak wstawić nowy wiersz z pliku wyjściowego pliku wsadowego?

Chcę zrobić coś takiego:

echo hello\nworld

Co da wynik:

hello
world

6
Przydał mi się. Musiałem zrobić echo \ n \ n | my_app.exe w skrypcie. Zrobiłem (echo. && echo.) | my_app.exe
Vignesh

2
Łatwe podejście „Kod zaczyna się:”> echo hello & echo world, da ci to, czego potrzebujesz
prudviraj

1
Możesz wstawić niewidzialny ascii chr (255) w osobnej linii, która wymusi pustą nową linię. Przytrzymaj klawisz [alt] i naciśnij 255 na klawiaturze. wstawia chr (255), który jest pustym kwadratem. tzn. „ echo (alt + 255) ” Można używać tylko klawiatury, a nie liczb na górze klawiatury do sprawdzania poprawności!
jwzumwalt

Tak jak połowa naprawy komputera podłącza ją i włącza, tak samo połowa rozwoju oprogramowania nazywam inżynierią kosmiczną . My potrzebujemy nasze linie puste tak.
Bob Stein,

Co powiesz na to ? echo Yes&echo No
scientist_7

Odpowiedzi:


462

echo hello & echo.world

Oznacza to, że możesz zdefiniować & echo.jako stałą dla nowego wiersza \n.


43
przykład nie wymaga echo. && echo hello && echo. && echo world
kropki

4
Czy możesz to zrobić za pomocą jednego echa, aby można było go przekierować do pliku?
Shahbaz

46
@Shahbaz -$ (echo Hello && echo World) > ./File.txt
Nathan JB

25
Rzecz z okresu w „echo”. nigdy nie przestaje mnie zadziwiać. Jest tak stary, a ja zawsze zapominam, że kropka musi być ściśle powiązana z nazwą polecenia, bez odstępów między nimi. Twój post nie zawiera błędu, piszę to tylko jako przypomnienie: „echo”. ! = "echo." !
quetzalcoatl

5
@quetzalcoatl, robi się jeszcze dziwniejszy. Inne znaki oprócz kropki też działają. SS64 mówi, że lepsza składnia ma na echo(celu zwiększenie wydajności (wciąż nie zwracając uwagi na przestrzeń). Rozszerzona dyskusja o innych postaciach i ich zaletach / wadach w ECHO. NIE MOŻE podać tekstu lub pustej linii - zamiast tego użyj ECHO /
matt wilkie

557

Posługiwać się:

echo hello
echo.
echo world

16
Czy jest to możliwe, podając ciąg w obrębie jednej instrukcji echa?
Brian R. Bondy,

5
Dlaczego musisz to zrobić za pomocą pojedynczej instrukcji echa; gdzie jest szkoda mieć innego?
Rob

3
@Rob, właśnie natknąłem się na ten problem i żadna z nich nie działa. Musisz powtórzyć jedno zdanie w moim przykładzie. Generuję niektóre pliki tex z HTML i generuję plik Makefile przy użyciu echo "Makefile contents (which has \n)" > Makefilewielu ech, to nie zadziałałoby
Shahbaz

3
Użyj & (lub &&), aby zrobić je w jednym zdaniu: Na przykład, aby wstawić „hello \ nworld” w pliku txt:(echo hello & echo world) >> ./test.txt
Ned Martin

4
W przypadku wieloliniowego wyjścia do pliku, dlaczego nie wykonać następujących czynności? echo line 1 > Makefilei potem echo line 2 >> Makefile. Użycie >>powoduje, że dane wyjściowe są dołączane do pliku, a dokładnie takie zachowanie jest potrzebne w tym przypadku.
dgnuff

141

Proszę, utwórz plik .bat zawierający następujące elementy:

@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

Powinieneś zobaczyć dane wyjściowe takie jak:

There should be a newline
inserted here.

Press any key to continue . . .

Oczywiście potrzebny jest tylko kod między instrukcjami REM.


51
Bardzo imponujące, czy mógłbyś poświęcić czas na wyjaśnienie, jak działa zestaw linii NL = ^^^% NLM %% NLM% ^% NLM %% NLM%? Nie mogę tego
Andy Morris,

8
@andy uważa, że ​​komentarz +8 uzasadnia pytanie: stackoverflow.com/questions/6379619/...
matt wilkie

82
To wspaniały przykład pokazujący, że cmd.exe i pliki wsadowe systemu Windows są całkowicie szalone!
mivk

12
UWAGA DO SAMODZIELNOŚCI: Linia „set NLM = ^” nie może zawierać nic po CARET i musi mieć po nim 2 puste linie.
mnemotronic

4
Zobacz moją odpowiedź na prostszą metodę. set nl=^&echo., po prostu echo hello %nl% worlddaje ten sam efekt.
coltonon

96

W echo:plikach cmd / bat znajduje się standardowa funkcja do zapisywania pustej linii, która emuluje nową linię na wyjściu cmd:

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

Dane wyjściowe cytowanego powyżej pliku cmd:

line1

line2

37
W rzeczywistości każdy NIEUŻYWANY specjalny znak powinien działać. Zawsze zachęcam do używania /, ponieważ ukośnik jest standardowym char dla opcji poleceń. Poza tym zawsze krytykuję użycie kropki, którą niestety wybiera Microsoft, ponieważ polecenie: echo.com daje różne wyniki w zależności od wersji procesora poleceń MS-DOS / Windows Batch.
Aacini

21
Jedyną wersją, która zawsze działa, jest echo(. Wygląda na to, że może powodować problemy, ale w rzeczywistości działa idealnie. Wszystkie pozostałe formy mają co najmniej jedną sytuację, w której polecenie nie będzie działać zgodnie z oczekiwaniami.
dbenham

5
@naxa - Nic oficjalnego, tylko zbiorowa wiedza uzyskana przez kilku hakerów partii. Celem jest posiadanie składni, która może być użyta do ECHO dowolnej wartości, w tym niczego, i nigdy nie musisz się martwić o uzyskanie niczego poza oczekiwaniami. Najlepsze streszczenie, jakie znam, znajduje się na stronie dostips.com/forum/viewtopic.php?p=4554#p4554 . To trochę pozostawia cię wiszącego, ale nikt nigdy nie wpadł na scenariusz, w którym ECHO(zawodzi.
dbenham

2
@Pacerier - istnieją przykłady niepowodzenia dla każdej z tych sugestii. Przeczytaj uważnie dostips.com/forum/viewtopic.php?p=4554#p4554 .
dbenham

2
@Pacerier dzieje się tutaj wystarczająco dużo echa , aby uzyskać samodzielne pytanie. Być może coś w stylu „jakie postacie mogą natychmiast podążać echoi jakie są ich efekty?”
matt wilkie

68

Jak odpowiedź Kena, ale z wykorzystaniem opóźnionego rozszerzenia.

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

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

Najpierw tworzony jest pojedynczy znak kanału i przypisywany do zmiennej \ n.
Działa to, gdy karetka na końcu linii próbuje uciec od następnego znaku, ale jeśli jest to podawanie linii, jest ignorowane, a następny znak jest odczytywany i wybierany (nawet jeśli jest to również podawanie linii).
Następnie potrzebujesz trzeciego kanału do zakończenia bieżącej instrukcji, w przeciwnym razie trzeci wiersz zostałby dołączony do zmiennej LF.
Nawet pliki wsadowe mają zakończenia linii z CR / LF ważne są tylko LF, ponieważ CR są usuwane w tej fazie analizatora składni.

Zaletą korzystania z opóźnionego rozszerzenia jest to, że nie ma żadnej obsługi znaków specjalnych.
echo Line1%LF%Line2nie powiedzie się, ponieważ parser przestaje analizować przy pojedynczych liniach.

Więcej wyjaśnień znajduje się w
SO: Długie polecenia podzielone na wiele wierszy w pliku wsadowym (.bat) Vista / DOS
SO: Jak analizuje skrypty interpretera poleceń systemu Windows (CMD.EXE)?

Edycja: Unikaj echo.

To nie odpowiada na pytanie, ponieważ pytanie dotyczyło pojedynczego, echoktóry może wyprowadzać wiele wierszy.

Ale pomimo innych odpowiedzi, które sugerują użycie echo.do utworzenia nowej linii, należy zauważyć, że echo.jest to najgorsze, ponieważ jest bardzo powolne i może całkowicie zawieść, ponieważ cmd.exe szuka pliku o nazwie ECHOi próbuje go uruchomić.

Aby wydrukować tylko pustą linię, możesz użyć jednego z nich

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

Ale stosowanie echo., echo\lub echo:powinny być unikane, ponieważ mogą one być bardzo powolny, w zależności od miejsca, w którym skrypt zostanie wykonany, jak dysk sieciowy.


1
Jeśli przekażesz ciąg znaków z nowymi liniami jako parametr do podprogramu wsadowego, np. call :pause line1!\n!line2Uruchom podprogram za pomocą setlocal EnableDelayedExpansioni zakończ go, setlocal DisableDelayedExpansionaby nie dopuścić do przedwczesnej interpretacji nowych linii.
stevek_mcc

2
+1 za obsadę postaci echo, echo; echo( echo/ echo+ echo=i galerię łotrów echo. echo\ echo:. Teraz, jeśli miałbyś wyjaśnić, dlaczego, do cholery, te prace, byłbym ci winien darmowe piwo.
Bob Stein,

40

echo. Wystarczająco powiedziane.

Jeśli potrzebujesz go w jednym wierszu, użyj & . Na przykład,

echo Line 1 & echo. & echo line 3

wyświetli się jako:

Line 1

line 3

Powiedzmy, że chcesz czegoś bardziej wyszukanego ...

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

Wyjścia

hello
world

Następnie po prostu wrzuć %n% kiedy chcesz nowy wiersz w instrukcji echa. Jest to bardziej zbliżone do \nużywanego w różnych językach.

Awaria

set n= ustawia zmienną n równą:

^ Usuwa następny symbol do naśladowania:

&Oznacza wykonanie innego polecenia w tym samym wierszu. Nie dbamy o poziom błędu (to echo instrukcji, aby głośno płakać), więc nie &&jest potrzebny.

echo. Kontynuuje instrukcję echa.

Wszystko to działa, ponieważ można faktycznie tworzyć zmienne, które są kodami, i używać ich w innych poleceniach. Jest to coś w rodzaju funkcji getta, ponieważ partia nie jest dokładnie najbardziej zaawansowanym językiem skryptowym powłoki. Działa to tylko dlatego, że wsadowo słabo używa zmiennych, nie oznacza między liczbami całkowitymi, znakami, zmiennoprzecinkowymi, łańcuchami itp.

Jeśli jesteś sprytny, możesz sprawić, aby działał z innymi rzeczami. Na przykład użycie go do wyświetlenia karty

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

7
Nie używaj, echo.gdy po raz pierwszy próbuje znaleźć plik o tej nazwie. Użyj innej interpunkcji, np.echo,
Przywróć Monikę

20

Gdy echo przekierowuje do pliku, wiele poleceń echa nie będzie działać. Myślę, że może przekierowanie „>>” jest dobrym wyborem:

echo hello> temp
echo world >> temp

8
Pierwszy przykład, używając „>”, utworzy nowy plik, drugi, używając „>>”, dołączy do istniejącego pliku (lub utworzy go, jeśli jeszcze nie istnieje).
Yann Duran,

1
(echo hello && echo world) > tempwspomniany przez Nathana J. Brauera w komentarzu do (aktualnych) przyjętych odpowiedzi.
GeroldBroser przywraca Monikę

15

Tak jak sugeruje Grimtron - oto szybki przykład, aby go zdefiniować:

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

Wynik

C:\>test.bat
hello
world

W rzeczywistości będzie to echo dodatkowej nowej linii po „świecie”
BlueRaja - Danny Pflughoeft,

1
@blue końcowy znak nowej linii wydaje się być funkcją samego pliku wsadowego. Jeśli powtórzysz echo hello %newline%worldlinię, nie ma między nimi spacji.
matt wilkie

2
echo "Hello %newline% world"zawodzi, ponieważ jest w cudzysłowie. Ponieważ to nie jest prawdziwa nowa linia.
jeb

14

Jeśli chcesz umieścić wyniki w pliku, możesz użyć

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

9

Możesz też tak zrobić,

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

Dane wyjściowe będą

a
b
c d

Zauważ, że po umieszczeniu go w pliku wsadowym „%” zostanie podwojone.

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

To rozwiązanie działa również, jeśli chcesz powtórzyć znak „&” zamiast znaku nowej linii.
parvus

Myślę, że znalazłem błąd: *char

7

Jeśli ktoś tu przychodzi, ponieważ chce odtworzyć pustą linię z makefile make MINGW, użyłem

@cmd /c echo.

zwykłe użycie echo.powoduje przerażający process_begin: CreateProcess(NULL, echo., ...) failed.komunikat o błędzie.

Mam nadzieję, że pomoże to przynajmniej jednej innej osobie :)


Ale to nie jest pytanie. Downvote!
Mesalcode

Nie jestem pewien, czy sarkazm czy nie: P
Wayne Uroda

Dowiedz się, przeglądając swoją skrzynkę odbiorczą: D
Mesalcode

3

Jeśli trzeba użyć słynnego \ n w literałach ciągów, które można przekazać do zmiennej, można napisać kod jak w skrypcie Hello.bat poniżej:

@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!%

W ten sposób wyjście wielowierszowe można przygotować w jednym miejscu, nawet w innym pliku scritpt lub zewnętrznym, i wydrukować w innym.

Podział linii jest utrzymywany w zmiennej nowej linii . Jej wartość musi być wprowadzona po echo linia jest rozszerzony tak używam setlocal enableDelayedExpansion włączyć znaki wykrzykników, które rozszerzają zmiennych na wykonanie. Oraz substytuty wykonanie \ n z nowej linii treści (poszukaj składni przy pomocy zestawu ). Oczywiście moglibyśmy użyć ! Newline! podczas ustawiania odpowiedzi, ale \ n jest wygodniejszy. Może być przekazywany z zewnątrz (spróbuj Hello R2 \ nD2 ), gdzie nikt nie zna nazwy zmiennej przechowującej podział linii (Tak, Witaj C3! Nowa linia! P0 działa w ten sam sposób).

Powyższy przykład może zostać zawężony do podprogramu lub samodzielnej partii, używanej jak call:mlecho Hi\nI'm your comuter:

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


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

Pamiętaj, że dodatkowy ukośnik odwrotny nie uniemożliwi parsowania skryptu \ n podciągów.


1
Zasadniczo robisz to samo co powyższa odpowiedź Jeba.
Squashman

Odpowiedzi, które przeczytałem powyżej, były bardzo pomocne, ale musiałem wywołać skrypt podprogramu, który sparsuje \ n, aby uniknąć implementacji tej sztuczki wszędzie. To wymagało dopracowania rozwiązania i podzieliłem się tym dopracowaniem. Mam nadzieję, że nie zaszkodzi żadnemu zwierzęciu.
Tomator

2

Działa to dla mnie, nie jest konieczne opóźnione rozszerzenie:

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

Zapisuje dane wyjściowe w następujący sposób:

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

4
-1 echo asdf >myfile.txtda dokładnie takie same wyniki. echodołącza nowy wiersz na końcu ciągu.
BlueRaja - Danny Pflughoeft

2
Świetna odpowiedź, jako jedyna osoba, która dostrzegła wartość używania nawiasu do nowych linii. Wierzę, że tak właśnie zamierzali twórcy DOS-a.
djangofan

2

Aby rozpocząć nowy wiersz wsadowo, wystarczy dodać „echo [”, tak:

echo Hi!
echo[
echo Hello!

5
Jest powolny i kończy się niepowodzeniem, gdy istnieje plik o nazwieecho[.bat
jeb

Co? Powinien działać natychmiast, a także po prostu usunąć plik echo [.bat.
PryroTech,

2
Jest to dokładnie to samo, co echo. składnia.
PryroTech,

5
Tak i echo.to też złe rozwiązanie.
jeb

1
Jak widać w poprzednich odpowiedziach, najpierw spróbuje zlokalizować plik na ścieżce, co powoduje, że jest on tak wolny. To samo dotyczy echo.. Oczekiwanie, że użytkownicy twojego skryptu będą usuwać pliki ze swojego systemu tylko dlatego, że twój skrypt wymaga nowej linii, nie brzmi dla mnie jak dobry projekt.
Abel

2

Rozwiązania Ken i Jeb działają dobrze.

Ale nowe wiersze są generowane tylko ze znakiem LF i potrzebuję znaków CRLF (wersja Windows).

W tym celu na końcu skryptu przekonwertowałem LF na CRLF.

Przykład:

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

0

Możesz użyć @echo(@echo + [spacja] + [niestabilna spacja])

Uwaga: Nietrwałe miejsce można uzyskać za pomocą Alt + 0160

Mam nadzieję, że to pomoże :)

[edytuj] Hmm, masz rację, potrzebowałem tego w pliku Makefile, działa tam idealnie. Myślę, że moja odpowiedź nie jest dostosowana do plików wsadowych ... Moje złe.


Nie dostałem ECHO ist eingeschaltet (ON).pustej linii, spróbowałem po poleceniu cmd
jeb

1
To niezniszczalna przestrzeń, a nie nowa linia.
Ry-

0

To rozwiązanie działa (przetestowane):

type nul | more /e /p

Konwertuje to pojedyncze linie linii na kombinację linii powrotu karetki.


Ale jak to dodaje nową linię między tekstem? Pytanie dotyczyecho hello \n world
jeb

Głosuj ode mnie. To nie jest odpowiedź na pytanie
Mesalcode

-2

Nie mogę tego uczynić prostszym niż:

echo echo hello^&echo world^&pause>silly.bat                       
call silly.bat
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.