Bir toplu iş dosyasında yeni satırı nasıl yankılandırabilirim?


642

Toplu iş dosyası çıktısından nasıl yeni satır eklersiniz?

Gibi bir şey yapmak istiyorum:

echo hello\nworld

Hangi çıktı:

hello
world

6
Benim için yararlı geldi. Echo yapmak zorunda kaldım \ n \ n | my_app.exe bir komut dosyasında. Yaptım (yankı. && yankı.) | my_app.exe
Vignesh

2
Kolay Yaklaşım "Kod başlar:"> yankı merhaba ve yankı dünyası, u ihtiyacınız olanı verecektir
prudviraj

1
Yeni ve boş bir satırı zorlayacak ayrı bir satıra görünmez bir ascii chr (255) ekleyebilirsiniz. [Alt] tuşunu basılı tutun ve tuş takımında 255 tuşuna basın. bu boş bir kare olan chr (255) ekler. yani " echo (alt + 255) " Tuş takımını yalnızca querty klavyenin üstündeki rakamları değil kullanabilirsiniz!
jwzumwalt

Tıpkı bilgisayar onarımının yarısının onu takıp açması gibi, uzay mühendisliği dediğim yazılım geliştirmenin yarısı . Biz gerek sadece bu yüzden bizim boş satırlar.
Bob Stein

Buna ne dersin ? echo Yes&echo No
scientist_7

Yanıtlar:


462

echo hello & echo.world

Bu, & echo.yeni satır için bir sabit olarak tanımlayabileceğiniz anlamına gelir \n.


43
örneğin bir echo. && echo hello && echo. && echo world
noktaya

4
Bir dosyaya yönlendirilebilmesi için bunu tek bir yankı ile yapabilir misiniz?
Shahbaz

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

25
"Eko" daki dönemsel şey. beni asla durdurmaz. O kadar tarihli ve hala her zaman nokta kesinlikle aralarında boşluk olmadan, komut adıyla birleştirilmesi gerektiğini unutuyorum. Gönderiminizde bir hata yok, bunu sadece bir hatırlatma olarak yazıyorum: "echo." ! = "yankı." !
quetzalcoatl

5
@quetzalcoatl, daha da garipleşiyor. Nokta dışındaki diğer karakterler de çalışır. SS64, daha iyi sözdiziminin daha echo(iyi performans için olduğunu söylüyor (yine de boşluk düşünmeden ). ECHO'daki diğer karakterler ve onların özellikleri / kusurları hakkında genişletilmiş tartışma . Metin veya boş satır vermek için
başarısız

558

kullanın:

echo hello
echo.
echo world

16
Tek bir echo deyimi içinde bir dize sağlarken mümkün mü?
Brian R. Bondy

5
Bunu neden tek bir yankı ifadesiyle yapmanız gerekiyor; bir başkasına sahip olmanın zararı nerede?
Rob

3
@Rob, bu sorunla daha yeni karşılaştım ve bunların hiçbiri işe yaramadı. Örneğimde tek bir ifadede yankı yapmanız gerekiyor. HTML'den bazı tex dosyaları oluşturuyorum ve kullanarak bir Makefile üretiyorum echo "Makefile contents (which has \n)" > MakefileBirden fazla echos ile işe yaramaz
Shahbaz

3
Tek bir ifadede yapmak için & (veya &&) kullanın: Örneğin, bir txt dosyasına "merhaba \ nworld" koymak için:(echo hello & echo world) >> ./test.txt
Ned Martin

4
Bir dosyaya çok satırlı çıktı için neden yalnızca aşağıdakileri yapmıyorsunuz? echo line 1 > Makefileve sonra echo line 2 >> Makefile. Kullanımı >>çıkış nedenleri tam olarak bu davayla ilgili ihtiyaç davranıştır dosyaya eklenecek.
dgnuff

141

İşte, içinde aşağıdakileri içeren bir .bat dosyası oluşturun:

@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

Çıkışı aşağıdaki gibi görmelisiniz:

There should be a newline
inserted here.

Press any key to continue . . .

Açıkçası sadece REM ifadeleri arasındaki koda ihtiyacınız vardır.


51
Çok etkileyici, NL = ^^^% NLM %% NLM% ^% NLM %% NLM% satır kümesinin nasıl çalıştığını açıklamak için zaman ayırır mısınız? Kafamı bulamıyorum
Andy Morris

8
@andy methinks a8 yorum bir soru gerektiriyor: stackoverflow.com/questions/6379619/…
matt wilkie

82
Bu cmd.exe ve Windows toplu iş dosyalarının tamamen deli olduğunu göstermek için harika bir örnek!
mivk

12
SELF İÇİN NOT: çizgi "set NLM = ^" olmalıdır şapkadan sonraki şey var ve olmalı ondan sonra 2 boş satırlar var.
mnemotronic

4
Daha basit bir yöntem için cevabımı görün. set nl=^&echo., sonra sadece echo hello %nl% worldaynı etkiyi verir.
coltonon

96

echo:Cmd çıktısında yeni bir satır öykünen boş satır yazmak için cmd / bat dosyalarında standart bir özellik vardır:

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

Belirtilen cmd dosyasının çıktısı:

line1

line2

37
Aslında, KULLANILMAMIŞ özel karakterlerin çalışması gerekir. / Komutunun kullanılmasını her zaman teşvik ederim çünkü eğik çizgi komut seçenekleri için standart karakterdir. Ayrıca, her zaman Microsoft'ta birinin ne yazık ki seçtiği nokta kullanımını eleştiriyorum çünkü komut: echo.com, MS-DOS / Windows Batch komut işlemcisinin sürümüne bağlı olarak farklı sonuçlar veriyor.
Aacini

21
Her zaman çalışan tek sürüm echo(. Sorunlara neden olabilir gibi görünüyor, ama aslında mükemmel çalışıyor. Diğer tüm formlarda, komutun istendiği gibi çalışmadığı en az bir durum vardır.
dbenham

5
@naxa - Hiçbir şey resmi değil, sadece birkaç toplu iş korsanı tarafından türetilen kolektif bilgi. Amaç, hiçbir şey dahil herhangi bir değeri ECHO için kullanabileceğiniz sözdizimine sahip olmak ve asla beklenenden başka bir şey elde etmek konusunda endişelenmenize gerek yok. Bildiğim en iyi özet dostips.com/forum/viewtopic.php?p=4554#p4554 adresinde . Bu sizi asılı bırakıyor, ama hiç kimse ECHO(başarısız olan bir senaryo geliştirmedi .
dbenham

2
@Pacerier - bu önerilerin her biri için başarısızlık örnekleri var. Dostips.com/forum/viewtopic.php?p=4554#p4554 dikkatlice okuyun .
dbenham

2
@Pacerier burada bağımsız bir soru için yeterince yankı var . Belki de "hangi karakterler hemen takip edebilir echove etkileri nelerdir?"
matt wilkie

68

Ken'in yanıtı gibi, ama gecikmeli genişlemenin kullanımı ile.

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

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

Önce tek bir satır besleme karakteri oluşturulur ve \ n değişkenine atanır.
Bu, satır sonundaki düzeltme işareti bir sonraki karakterden kaçmaya çalıştığında çalışır, ancak bu bir Satır besleme ise yok sayılır ve bir sonraki karakter okunur ve kaçınır (bu da bir satır besleme olsa bile).
Ardından, geçerli talimatı sonlandırmak için üçüncü bir satır beslemesine ihtiyacınız olur, aksi takdirde üçüncü satır LF değişkenine eklenir.
Toplu iş dosyaları bile CR / LF ile satır sonlarına sahiptir, yalnızca LF önemlidir, çünkü CR'ler ayrıştırıcının bu aşamasında kaldırılır.

Gecikmeli genişletmeyi kullanmanın avantajı, özel bir karakter işlemenin hiç olmamasıdır.
echo Line1%LF%Line2ayrıştırıcı tek satır beslemelerinde ayrışmayı durdurduğundan başarısız olur.

Daha fazla açıklama
SO adresindedir : Vista / DOS toplu iş (.bat) dosyasında birden çok satıra bölünmüş uzun komutlar
SO: Windows Komut Yorumlayıcı (CMD.EXE) komut dosyalarını nasıl ayrıştırır?

Düzenleme: Kaçının echo.

Bu soruya cevap vermiyor, çünkü soru echobirden fazla satır çıkarabilen tekli hakkındaydı .

Ancak, echo.yeni bir satır oluşturmak için kullanımını öneren diğer cevaplara rağmen, echo.cmd.exe adlı bir dosyayı ararken ECHOve başlatmaya çalıştığından , çok yavaş olduğu ve tamamen başarısız olabileceği belirtilmelidir .

Yalnızca boş bir satır yazdırmak için şunlardan birini kullanabilirsiniz:

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

Ama kullanımı echo., echo\ya da echo:onlar gerçekten yavaş olabilir gibi komut dosyası bir ağ sürücüsü gibi çalıştırılacaktır yerin bağlı olarak, kaçınılmalıdır.


1
Eğer yeni satırlı dizeyi bir toplu alt rutine parametre olarak geçirecekseniz, örneğin call :pause line1!\n!line2, alt rutini ile başlatın ve yeni satırların erken yorumlanmasını önlemek için setlocal EnableDelayedExpansionile bitirin setlocal DisableDelayedExpansion.
stevek_mcc

2
Karakterler echo, echo; echo( echo/ echo+ echo=ve rogues galerisi için +1 echo. echo\ echo:. Şimdi eğer bu işi neden kutsal bir şekilde açıklasaydın, sana bedava bira borçlu olurum.
Bob Stein

40

echo. Yeterince söylendi.

Tek bir satıra ihtiyacınız varsa &. Örneğin,

echo Line 1 & echo. & echo line 3

şöyle çıktılar:

Line 1

line 3

Şimdi, biraz meraklı bir şey istediğini söyle, ...

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

çıktılar

hello
world

Sonra sadece %n%bir echo deyiminde yeni bir satır istediğiniz zaman atın . Bu, \nçeşitli dillerde kullanımınıza daha yakındır .

Yıkmak

set n=değişkeni nşuna eşit ayarlar :

^ İzlenecek sonraki sembolü geçersiz kılar:

&Aynı satırda başka bir komut yapmak anlamına gelir. Biz hata seviyesi umurumda değil (yüksek sesle ağlamak için bir yankı ifadesi), bu yüzden gerek yok &&.

echo. Echo ifadesini sürdürür.

Tüm bunlar çalışır çünkü kod olan değişkenler oluşturabilir ve bunları diğer komutların içinde kullanabilirsiniz. Bu, bir getto işlevi gibi, çünkü toplu iş tam olarak kabuk komut dosyası dillerinin en gelişmişi değil. Bu sadece, kümenin değişkenleri kötü kullanması, çünkü ints, char, float, string, vb.

Eğer kurnazsanız, bunu başka şeylerle çalıştırabilirsiniz. Örneğin, bir sekmeyi tekrarlamak için kullanma

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

7
Do not kullanmak echo.bu isimde bir dosyayı bulmak için buna ilk girişimleri. Gibi başka noktalama işaretleri kullanınecho,
Reinstate Monica

20

Bir dosyaya yeniden yönlendirilecek bir şey yankılanırken, birden çok yankı komutu çalışmaz. Bence ">>" yönlendiricisi iyi bir seçimdir:

yankı merhaba> sıcaklık
yankı dünya >> sıcaklık

8
İlk örnek, ">" kullanarak yeni bir dosya oluşturur, ikincisi ">>" kullanarak mevcut bir dosyaya eklenir (veya zaten mevcut değilse oluşturur).
Yann Duran

1
(echo hello && echo world) > tempNathan J. Brauer tarafından (şimdiki) kabul edilen cevap çalışmalarına yaptığı açıklamada bahsedilen.
GeroldBroser, Monica

15

Tıpkı Grimtron'un önerdiği gibi - bunu tanımlamak için hızlı bir örnek:

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

Çıktı

C:\>test.bat
hello
world

Aslında "dünya" dan sonra yeni bir satır daha yankılayacak
BlueRaja - Danny Pflughoeft

1
@blue son satırsonu toplu iş dosyasının kendisi gibi görünüyor. echo hello %newline%worldÇizgiyi tekrarlarsanız arasında boşluk yoktur.
matt wilkie

2
echo "Hello %newline% world"tırnak içinde olduğu gibi başarısız olur. Çünkü gerçek bir satırsonu değil .
jeb

14

Sonuçları bir dosyaya koymanız gerekiyorsa,

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

9

Bunu da yapabilirsiniz,

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

Çıktı,

a
b
c d

Bu bir toplu iş dosyasına konduğunda, '%' değerinin iki katına çıkacağını unutmayın.

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

Bu çözüm, bir ve işareti bir satırsonu yerine yankılamak istiyorsanız da işe yarar.
parvus

sanırım bir hata buldum: *char

7

Eğer birisi buraya gelirse, çünkü bir MINGW marka makefile boş bir çizgi yankılamak istiyor, ben kullandım

@cmd /c echo.

sadece kullanmak echo.korkunç process_begin: CreateProcess(NULL, echo., ...) failed.hata mesajına neden olur .

Umarım bu en az bir kişiye yardımcı olur :)


Ama soru bu değil. Downvote!
Mesalcode

Alaycı olup olmadığından emin değilim: P
Wayne Uroda


3

Bir değişkene iletilebilen dize değişmezlerinde ünlü \ n kullanılması gerekiyorsa, aşağıdaki Hello.bat komut dosyasında olduğu gibi bir kod yazabilir :

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

Bu şekilde çok satırlı çıktı, bir başka yerde, başka bir yazı veya harici dosyada bile hazırlanabilir ve başka bir yere yazdırılabilir.

Satır sonu, yeni satır değişkeninde tutulur . Onun değeri ikame edilmelidir sonra yankı hat kullandığım böylece genişletilir Setlocal enableDelayedExpansion yürütme değişkenleri genişletmek ünlem işaretleri etkinleştirmek için. Ve yürütme \ n yerine yeni satır içeriklerini koyuyor ( yardım kümesinde sözdizimi arayın ). Tabii ki kullanabiliriz ! ayarlanırken cevabı ancak \ n daha uygundur. Dışarıdan geçirilebilir ( Hello R2 \ nD2'yi deneyin ), burada kimse satır sonunu tutan değişkenin adını bilmiyor (Evet, Merhaba C3! Newline! P0 aynı şekilde çalışır).

Yukarıdaki örnek, aşağıdaki gibi kullanılan bir altyordam veya bağımsız bir seri için rafine edilebilir call:mlecho Hi\nI'm your comuter:

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


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

Ek ters eğik çizginin komut dosyasının \ n alt dizesini ayrıştırmasını engellemeyeceğini lütfen unutmayın.


1
Esasen yukarıdaki Jeb cevabı ile aynı şeyi yapıyorsunuz.
Squashman

Yukarıda okuduğum cevaplar çok yardımcı oldu, ancak her yerde hile uygulamaktan kaçınacak bir komut od alt programı çağırmak gerekiyordu. Bunun bir çözümü düzeltmek gerekiyordu ve bu ayrıntılandırmayı paylaştım. Umarım herhangi bir hayvana zarar vermez.
Haziran'da Tomator

2

Bu benim için çalıştı, gecikmeli genişlemeye gerek yok:

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

Çıkışı şöyle yazar:

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

4
-1 echo asdf >myfile.txttam olarak aynı sonuçları verecektir. echodizenin sonuna bir satırsonu ekler.
BlueRaja - Danny Pflughoeft

2
Yeni satırlar için parantez kullanmanın değerini bilen tek kişi büyük cevap. İnanıyorum ki, DOS yapanlar bunu sizin için yapmayı istediler.
djangofan

2

Toplu olarak yeni bir satır başlatmak için tek yapmanız gereken "echo [" eklemektir, şöyle:

echo Hi!
echo[
echo Hello!

5
Yavaş ve adında bir dosya bulunduğunda başarısız oluyorecho[.bat
jeb

Ne? Anında çalışmalı ve sadece echo [.bat dosyasını silmeli.
PryroTech

2
Eko ile hemen hemen aynı şey. sözdizimi.
PryroTech

5
Evet ve echo.kötü bir çözüm.
jeb

1
Önceki yanıtlarda görülebileceği gibi, bu önce yoldaki bir dosyayı bulmaya çalışacak ve bu da çok yavaş olmasına neden olacaktır. Aynı şey için de geçerlidir echo.. Betiğinizin kullanıcılarının, betiğinizin yeni bir satıra ihtiyacı olması nedeniyle sistemlerindeki dosyaları silmelerini beklemek bana iyi bir tasarım gibi gelmiyor.
Abel

2

Ken ve Jeb çözümleri iyi çalışıyor.

Ancak yeni satırlar sadece bir LF karakteri ile oluşturulur ve CRLF karakterlerine ihtiyacım var (Windows sürümü).

Bunun için, komut dosyasının sonunda, LF'yi CRLF'ye dönüştürdüm.

Misal:

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

0

Sen kullanabilirsiniz @echo(@echo + [boşluk] + [insecable boşluk])

Not: Güvenli olmayan alan Alt + 0160 ile elde edilebilir

Umarım yardımcı olur :)

Hmm haklısın, bir Makefile'de ihtiyacım vardı, orada mükemmel çalışıyor. Sanırım cevabım toplu iş dosyalarına uyarlanmadı ... Benim hatam.


Bende ECHO ist eingeschaltet (ON).cmd-istemi de denenmiş boş bir satır değil
Jeb

1
Bu kırılmaz bir alan, yeni satır değil.
Ry-

0

Bu çözüm çalışır (Test edildi):

type nul | more /e /p

Bu, izole edilmiş satır beslemelerini satırbaşı geri besleme hattına dönüştürür.


Peki bu bir metin arasına nasıl yeni satır ekler? Soru şuecho hello \n world
jeb

Benden alçalt. Bu sorunun cevabı değil
Mesalcode

-2

Ben daha basit yapamaz:

echo echo hello^&echo world^&pause>silly.bat                       
call silly.bat
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.