Toplu iş dosyası çıktısından nasıl yeni satır eklersiniz?
Gibi bir şey yapmak istiyorum:
echo hello\nworld
Hangi çıktı:
hello
world
echo Yes&echo No
Toplu iş dosyası çıktısından nasıl yeni satır eklersiniz?
Gibi bir şey yapmak istiyorum:
echo hello\nworld
Hangi çıktı:
hello
world
echo Yes&echo No
Yanıtlar:
echo hello & echo.world
Bu, & echo.
yeni satır için bir sabit olarak tanımlayabileceğiniz anlamına gelir \n
.
echo. && echo hello && echo. && echo world
$ (echo Hello && echo World) > ./File.txt
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
kullanın:
echo hello
echo.
echo world
echo "Makefile contents (which has \n)" > Makefile
Birden fazla echos ile işe yaramaz
(echo hello & echo world) >> ./test.txt
echo line 1 > Makefile
ve sonra echo line 2 >> Makefile
. Kullanımı >>
çıkış nedenleri tam olarak bu davayla ilgili ihtiyaç davranıştır dosyaya eklenecek.
İş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.
set nl=^&echo.
, sonra sadece echo hello %nl% world
aynı etkiyi verir.
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
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.
ECHO(
başarısız olan bir senaryo geliştirmedi .
echo
ve etkileri nelerdir?"
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%Line2
ayrış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 echo
birden 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 ECHO
ve 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.
call :pause line1!\n!line2
, alt rutini ile başlatın ve yeni satırların erken yorumlanmasını önlemek için setlocal EnableDelayedExpansion
ile bitirin setlocal DisableDelayedExpansion
.
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.
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
echo.
bu isimde bir dosyayı bulmak için buna ilk girişimleri. Gibi başka noktalama işaretleri kullanınecho,
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
(echo hello && echo world) > temp
Nathan J. Brauer tarafından (şimdiki) kabul edilen cevap çalışmalarına yaptığı açıklamada bahsedilen.
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
C:\>test.bat
hello
world
echo hello %newline%world
Çizgiyi tekrarlarsanız arasında boşluk yoktur.
echo "Hello %newline% world"
tırnak içinde olduğu gibi başarısız olur. Çünkü gerçek bir satırsonu değil .
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)
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 :)
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.
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 . . .
echo asdf >myfile.txt
tam olarak aynı sonuçları verecektir. echo
dizenin sonuna bir satırsonu ekler.
Toplu olarak yeni bir satır başlatmak için tek yapmanız gereken "echo [" eklemektir, şöyle:
echo Hi!
echo[
echo Hello!
echo[.bat
echo.
kötü bir çözüm.
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.
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
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.
ECHO ist eingeschaltet (ON).
cmd-istemi de denenmiş boş bir satır değil