Uzun komutları Windows toplu iş dosyasıyla birden çok satıra bölme


735

Bir toplu iş dosyasında uzun komutları birden çok satıra nasıl bölebilirim?

Yanıtlar:


919

^Düzeltme işareti ve takip eden satırın tamamen kaldırıldığını hatırladığınız sürece düzeltme işareti ile uzun satırları ayırabilirsiniz . Yani, çizgiyi kırdığınız bir boşluk varsa, bir boşluk ekleyin. ( Aşağıda daha fazlası. )

Misal:

copy file1.txt file2.txt

şöyle yazılır:

copy file1.txt^
 file2.txt

95
^Komut metninizden hemen önce ve sonra boşluk eklerseniz sonraki satırı boşluk bırakmadan başlatabilirsiniz .
Joseph Daigle

4
@SebaIllingworth - Hayır, her zaman [SPACE] + [^] ve iki boş satır eklediğinizde, toplam 2 satır beslemesi oluşturduğunuzda ekleyebilirsiniz echo.
James K

12
Güvenlik için , satırları kullanırken her zaman boş satırla biter , bkz . Toplu iş dosyasındaki basit karat tüm belleği tüketir
matt wilkie

4
@GavinMiller: "kopyadan sonra düzeltme kodu ^ ve yeni bir satırdaki file1.txt çalışmaz" Bu doğru değil. Satırı, kelimenin ortasında da dahil olmak üzere herhangi bir yere bölebilirsiniz co^␍py ^␍file1 ^␍file2. Karışıklığı önlemek için yorumunuzu silmenizi öneririm, özellikle de bu görev çok popüler olduğu için
Borodin

3
Burada bir varcha ^ satırındaki son karakter olması gerekir - yani boşluk sonra. Bu konuda sorun yaşıyordum ve şapkadan sonra bir sürü boşluğum olduğu ortaya çıktı - kullandığım editörde kolayca görülemedi.
GregHNZ

266

Caret kuralı:

Satır ucundaki bir düzeltme işareti, bir sonraki satıra eklenir, eklenen satırın ilk karakteri kaçacaktır.

Düzeltmeyi birden çok kez kullanabilirsiniz, ancak tüm satır en fazla ~ 8192 karakter uzunluğunu (Windows XP, Windows Vista ve Windows 7) aşmamalıdır.

echo Test1
echo one ^
two ^
three ^
four^
*
--- Output ---
Test1
one two three four*

echo Test2
echo one & echo two
--- Output ---
Test2
one
two

echo Test3
echo one & ^
echo two
--- Output ---
Test3
one
two

echo Test4
echo one ^
& echo two
--- Output ---
Test4
one & echo two

Bir sonraki karakterin kaçmasını bastırmak için bir yönlendirme kullanabilirsiniz.

Yönlendirme caret'in hemen önünde olmalıdır. Ancak, düzeltme işaretinden önce yeniden yönlendirmeyle ilgili bir merak var.

Düzeltme çubuğuna bir belirteç yerleştirirseniz belirteç kaldırılır.

echo Test5
echo one <nul ^
& echo two
--- Output ---
Test5
one
two


echo Test6
echo one <nul ThisTokenIsLost^
& echo two
--- Output ---
Test6
one
two

Ayrıca, satır beslemelerini dizeye gömmek de mümkündür :

setlocal EnableDelayedExpansion
set text=This creates ^

a line feed
echo Test7: %text%
echo Test8: !text!
--- Output ---
Test7: This creates
Test8: This creates
a line feed

Boş çizgi başarı için önemlidir. Bu sadece gecikmeli genişleme ile çalışır, aksi takdirde hattın geri kalanı hat beslemesinden sonra yok sayılır.

Satır ucundaki düzeltme işareti bir sonraki satır beslemesini yok sayar ve sonraki karakter aynı zamanda satır besleme olsa bile sonraki karakterden kaçar (satır başları bu aşamada her zaman yoksayılır).


Satır besleme örneğine sahip son kod bloğu, orada olmasına rağmen boş satırı görüntülemez. (En azından IE7'de görünmüyor) Bunun yerine bir blok alıntı kullanarak yeniden biçimlendirmeyi deneyin.
dbenham

5
Soru şu ki, kurallara uymayan kötü bir aracı mı desteklemeliyiz (birisi ona tarayıcı diyor, ancak değil) mi yoksa bir tarayıcıya mı geçmelisiniz?
jeb

1
set var = "metin burada ^" olduğu gibi değerlerimi çevreleyen çift tırnak vardı ama çalışmıyor. Çift tırnak kaldırmak ve gayet iyi.
rjt

1
@jeb, başarısız bir cmd komut dosyası yazdı, ancak sonra bu soruyu buldu: stackoverflow.com/questions/4643376/…
rjt

Bir sonraki satır bir tırnak işareti ile başlıyorsa copy ^[newline]"file1.txt" ^[newline]"file2.txt"bu çalışmaz : çalışmıyor! Bir boşluk eklemem gerekiyordu copy ^[newline] "file1.txt" ^[newline] "file2.txt".
Alexander Gelbukh

70

(Bu temelde Wayne'in cevabının yeniden yazılmasıdır, ancak caret etrafındaki karışıklık giderildi. Bu yüzden CW olarak yayınladım. Cevapları düzenlemekten utanmıyorum, ancak tamamen yeniden yazmak uygunsuz görünüyor.)

Caret ( ^) ile uzun satırları ayırabilirsiniz , sadece caret ve onu izleyen satırsonunun komuttan tamamen kaldırıldığını unutmayın , bu nedenle boşluk bırakılması gereken yere koyarsanız (parametreler arasında), alanı da dahil etmek için (bir ^sonraki satırın başlangıcından önce ya da başında - bu ikinci seçim, bir devamıdır).

Örnekler: (tümü Windows XP ve Windows 7'de test edilmiştir)

xcopy file1.txt file2.txt

şu şekilde yazılabilir:

xcopy^
 file1.txt^
 file2.txt

veya

xcopy ^
file1.txt ^
file2.txt

ya da

xc^
opy ^
file1.txt ^
file2.txt

(Son eserler That betwen boşluk olmadığından dolayı xcve ^bir sonraki satırın başına ve hiçbir boşluk. Yani kaldırdığınızda ^ve yeni satır elde edersiniz ... xcopy.)

Okunabilirlik ve akıl sağlığı için, muhtemelen en iyi ihtimalle sadece parametreler arasında kırılır (boşluğu eklediğinizden emin olun).

Emin olun ^olduğu değil orada şekilde Toplu dosyasındaki son şey bu büyük bir sorun olarak görünmektedir .


18

Çoklu komutlar parantez içine alınabilir ve çok sayıda satıra yayılabilir; böyle bir şey echo hi && echo helloşu şekilde konabilir:

( echo hi
  echo hello )

Ayrıca değişkenler yardımcı olabilir:

set AFILEPATH="C:\SOME\LONG\PATH\TO\A\FILE"
if exist %AFILEPATH% (
  start "" /b %AFILEPATH% -option C:\PATH\TO\SETTING...
) else (
...

Ayrıca koşulların sadece bir boşluk varsa onları takip etmeyi sevdiğini carets ( ^) ile fark ettim if:

if exist ^

1
Çizgi cmd1.bat && cmd2.batparens formundan farklı: execute cmd2.batiff cmd1.batbaşarıyla yürütüldü (-ayarı olmadan %errorcode%). İkinci form koşulsuz olarak yürütülür. Biraz beklenmedik (en azından benim için), açıkça, &&satır sonundan önce her iki + ifadesini de kullanamazsınız .
Paul Michalik

( echo <line break here> hello )boş bir satıra neden olur.
Karl Morrison

en iyi ve en temiz cevap!
carge

9

Bununla birlikte, bir for döngüsünün değerlerinin ortasında bölünmenin bir düzeltme gerektirmez (ve aslında birini kullanmaya çalışmak bir sözdizimi hatası olarak kabul edilir). Örneğin,

for %n in (hello
bye) do echo %n

Merhabadan sonra veya hoşçakaldan önce yer bile gerekmediğini unutmayın.


Tabii ki, bu forsözdiziminin bir parçasıdır : "for-set" içindeki elemanların ayırıcıları boşluk, virgül, noktalı virgül, eşittir işareti, SEKME karakteri ve yeni satırlardır.
Aacini

Peki ya dobölüm birden fazla / iç içe if-elseifadeler içeriyorsa ?
Vicky Dev

Daha sonra, (merhaba güle güle) do (echo% n echo% n) içindeki% n gibi ifadeleri içine almak için parantezleri kullanabilirsiniz
Mohammed Safwat
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.