Jak wstawić nowy wiersz z pliku wyjściowego pliku wsadowego?
Chcę zrobić coś takiego:
echo hello\nworld
Co da wynik:
hello
world
echo Yes&echo No
Jak wstawić nowy wiersz z pliku wyjściowego pliku wsadowego?
Chcę zrobić coś takiego:
echo hello\nworld
Co da wynik:
hello
world
echo Yes&echo No
Odpowiedzi:
echo hello & echo.world
Oznacza to, że możesz zdefiniować & echo.
jako stałą dla nowego wiersza \n
.
echo. && echo hello && echo. && echo world
$ (echo Hello && echo World) > ./File.txt
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 /
Posługiwać się:
echo hello
echo.
echo world
echo "Makefile contents (which has \n)" > Makefile
wielu ech, to nie zadziałałoby
(echo hello & echo world) >> ./test.txt
echo line 1 > Makefile
i 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.
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.
set nl=^&echo.
, po prostu echo hello %nl% world
daje ten sam efekt.
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
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.
ECHO(
zawodzi.
echo
i jakie są ich efekty?”
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%Line2
nie 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, echo
któ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 ECHO
i 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.
call :pause line1!\n!line2
Uruchom podprogram za pomocą setlocal EnableDelayedExpansion
i zakończ go, setlocal DisableDelayedExpansion
aby nie dopuścić do przedwczesnej interpretacji nowych linii.
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.
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 \n
uż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
echo.
gdy po raz pierwszy próbuje znaleźć plik o tej nazwie. Użyj innej interpunkcji, np.echo,
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
(echo hello && echo world) > temp
wspomniany przez Nathana J. Brauera w komentarzu do (aktualnych) przyjętych odpowiedzi.
Tak jak sugeruje Grimtron - oto szybki przykład, aby go zdefiniować:
@echo off
set newline=^& echo.
echo hello %newline%world
C:\>test.bat
hello
world
echo hello %newline%world
linię, nie ma między nimi spacji.
echo "Hello %newline% world"
zawodzi, ponieważ jest w cudzysłowie. Ponieważ to nie jest prawdziwa nowa linia.
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)
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 :)
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.
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 . . .
echo asdf >myfile.txt
da dokładnie takie same wyniki. echo
dołącza nowy wiersz na końcu ciągu.
Aby rozpocząć nowy wiersz wsadowo, wystarczy dodać „echo [”, tak:
echo Hi!
echo[
echo Hello!
echo[.bat
echo.
to też złe rozwiązanie.
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.
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
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.
ECHO ist eingeschaltet (ON).
pustej linii, spróbowałem po poleceniu cmd