Windows CMD'de bir satırda iki komutu nasıl çalıştırabilirim?


961

Windows CMD konsolunda iki komut çalıştırmak istiyorum.

Linux'ta böyle yapardım

touch thisfile ; ls -lstrh

Windows'da nasıl yapılır?

Yanıtlar:


1320

2000 yılından bu yana tüm Microsoft işletim sistemlerinde böyle ve bugün hala iyi:

dir & echo foo

İkinci komutun yalnızca ilk başarılı bir şekilde çıkılması durumunda yürütülmesini istiyorsanız:

dir && echo foo

Bir satırda birden çok komut yürütmek için tek ve (ve) sözdizimi Windows XP, Windows 2000 ve önceki bazı NT sürümlerine geri döner. (En az 4.0, burada bir yorumcuya göre.)

Bununla ilgili olarak, bu sayfayı aşağı kaydırırken bulacağınız birkaç nokta daha var.

Bunu eğitimsel bulabilenler için geçmiş veriler izler.

Bundan önce && sözdizimi, Microsoft komut yorumlayıcısına eklenmeden önce 4DOS kabuk değiştirme işleminin yalnızca bir özelliğiydi.

Windows 95, 98 ve ME'de bunun yerine dikey çizgi karakterini kullanırsınız:

dir | echo foo

MS-DOS 5.0 ve sonraki sürümlerde, komut yorumlayıcısının önceki bazı Windows ve NT sürümlerinde, (belgesiz) komut ayırıcı, burada ^ T ile temsil edeceğim karakter 20 (Ctrl + T) idi.

dir ^T echo foo

26
En azından NT 4'e kadar.
Joey

17
Win 8.0 ve 8.1 üzerinde de çalışır.
MEMark

5
@Fallenreaper, düz cmdistemde de çalışıyor, bu yüzden içine girmek kötü bir alışkanlık değil. :)

6
@Fallenreaper İkisi arasındaki pratik farkın farkında olduğunuzdan emin olun: Aşağıdaki Raihan'ın cevabına bakınız.
Moshe Katz

8
Anladım. A && B, B sadece A başarılı olursa çalışır, A & B A'dan sonra B'yi çalıştırır, A sonucu ne olursa olsun.
Head

579

Belgelerden bir alıntı:

Birden fazla komut ve koşullu işleme sembolü kullanma

Koşullu işleme sembollerini kullanarak tek bir komut satırından veya komut dosyasından birden fazla komut çalıştırabilirsiniz. Koşullu işlem sembolleriyle birden çok komut çalıştırdığınızda, koşullu işlem sembolünün sağındaki komutlar, koşullu işlem sembolünün solundaki komutun sonuçlarına göre çalışır.

Örneğin, bir komutu yalnızca önceki komut başarısız olduğunda çalıştırmak isteyebilirsiniz. Veya, yalnızca önceki komut başarılı olduğunda bir komut çalıştırmak isteyebilirsiniz.

Birden fazla komut iletmek için aşağıdaki tabloda listelenen özel karakterleri kullanabilirsiniz.

  • & [...]
    command1 & command2
    Bir komut satırında birden çok komutu ayırmak için kullanın. Cmd.exe önce ilk komutu sonra da ikinci komutu çalıştırır.

  • && [...]
    command1 && command2
    && komutunu izleyen komutu yalnızca sembolün önündeki komut başarılı olduğunda çalıştırmak için kullanın. Cmd.exe ilk komutu çalıştırır ve sonra yalnızca ilk komut başarıyla tamamlandığında ikinci komutu çalıştırır.

  • || [...]
    command1 || command2
    Aşağıdaki komutu çalıştırmak için kullanın || sadece önceki komut || başarısız olur. Cmd.exe ilk komutu çalıştırır ve sonra yalnızca ilk komut başarıyla tamamlanmadıysa (sıfırdan büyük bir hata kodu alırsa) ikinci komutu çalıştırır.

  • ( ) [...]
    (command1 & command2)
    Birden çok komutu gruplamak veya iç içe yerleştirmek için kullanın.

  • ; or ,
    command1 parameter1;parameter2
    Komut parametrelerini ayırmak için kullanın.


41
Deneyin cmd /c "echo foo & echo bar".
Raihan

2
vagrant up && vagrant sshWindows 10'da tırnak işaretleri olmadan çalıştı
furman87

Teşekkürler! Singe hakkında bilmiyordum &- onu asenkron hale getiriyor ve her ikisini de paralel olarak çalıştırıyor. Ben ile kullanıyordum çünkü &&senkron oldu ve sadece ilk başarılı olursa devam ediyor!
TetraDev

1
dokümantasyon bağlantısı kesik, yeni konum technet.microsoft.com/en-us/library/bb490954.aspx
NKEF

7
@TetraDev &komutları eşzamansız veya paralel yapmaz. tamamlandıktan sonracommand1 & command2 çalışır . Başarısı veya başarısızlığı önemsizdir. command2 command1command1
bornfromanegg

74

&Bash eşdeğeri ;(run komutları) ve &&Bash eşdeğeri &&(run komutları yalnızca önceki hataya neden olmadığında).


1
bu csh, tcsh ve daha birçok mermi için de geçerlidir. Daha önce hiç ;Linux'ta görmedim
phuclv

10
Sh tarzı kabuklarda @ LưuVĩnhPhúc ;, ilk komutu çalıştırmak, bitmesini beklemek, sonra ikinci komutu çalıştırmak anlamına gelir. &ilk komutu çalıştırmak, arka plana koymak ve ikinci komutu çalıştırmak anlamına gelir. Böylece her iki program aynı anda başlatılır. Bunların sembolleri birleştirmediğini, bunların ilk komuta ait semboller olduğunu unutmayın; progname &ikinci bir komuta sahip olmadan arka planda tek bir komut başlatabilirsiniz .
MM

25

Komutları art arda çalıştırmak için & tuşunu kullanabilirsiniz. Misal:c:\dir & vim myFile.txt


19

Bir cmd kısayolu oluşturmak istiyorsanız (örneğin masaüstünüzde) / k parametresini ekleyin (/ k keep anlamına gelir, / c pencereyi kapatır):

cmd /k echo hello && cd c:\ && cd Windows

16

Çok yakında değerlendirilen ortam değişkenleri sorununun üstesinden gelmek için çağrıyı kullanabilirsiniz - ör.

set A=Hello & call echo %A%

1
Bu yalnızca değişken önceden ayarlanmamışsa çalışır, bu durumda yeni değeri echoyazdırmaz, eski değeri yazdırır . En azından, Windows 7 kutumda gözlemlediğim şey bu.
Craig M. Brandenburg

Değişkenin ayarlanmadığından emin olmak için set A = ilkini kullanıyorum.
SSi

1
Daha iyi bir yöntem, gecikmeli genişletmeyi ( setlocal EnableDelayedExpansionbir komut dosyasında veya cmd /v) kullanmaktır. Örneğin: timeout 5 && cmd /v /c echo !TIME! && echo %TIME%.
Nick

5
Yeni değeri almak için ilk yüzde sonra ^ kullanın: set A = Merhaba ve çağrı echo% ^ A%
Nicolas

9

Aynı satırda birden fazla komut çalıştırılırken bir dizi işlem sembolü kullanılabilir ve bazı durumlarda işlem yeniden yönlendirmeye, başka bir durumda çıktıyı değiştirmeye veya başarısız olmasına neden olabilir. Önemli bir durum, değişkenleri işleyen aynı satır komutlarına yerleştirmektir.

@echo off
setlocal enabledelayedexpansion
set count=0
set "count=1" & echo %count% !count!

0 1

Yukarıdaki örnekte gördüğünüz gibi, değişkenleri kullanan komutlar aynı satıra yerleştirildiğinde, değişken değerlerinizi güncellemek için gecikmeli genişletmeyi kullanmanız gerekir. Değişkeniniz dizine eklenmişse, değerini aynı satırda güncellemek için %% değiştiricileri ile CALL komutunu kullanın:

set "i=5" & set "arg!i!=MyFile!i!" & call echo path!i!=%temp%\%%arg!i!%%

path5=C:\Users\UserName\AppData\Local\Temp\MyFile5

verilen örnek benim için çalışmadı ama birinin altında:cmd /V:ON /c "set i=5 & set arg!i!=MyFile!i! & echo path!i!=%temp%\%arg!i!%"
sactiw

8

cmd /c ipconfig /all & Output.txt

Bu komut komutu yürütür ve Output.txtdosyayı tek bir komutta açar


8

Yani, RegAsmbir bağlam menüsünden çalışan belirli bir görev (kayıt derleme) etkinleştirmeye çalışıyordum . Sahip olduğum sorun, sonuç okunmadan önce yanıp sönecek ve gidecekti. Bu yüzden Pause, komut başarısız olduğunda borulama denedim (burada belirtildiği gibi Pause komutu .bat komut dosyasında çalışmıyor ve burada Toplu dosya komutu PAUSE çalışmıyor ). Bu yüzden denedim cmd /kama daha fazla komut için pencereyi açık bırakır (sadece sonucu okumak istiyorum). Bu yüzden zincire bir pausetakipçisi ekledim exitve sonuç olarak:

cmd /k C:\Windows\Microsoft.NET\Framework\v4.0.30319\regasm.exe "%1" /codebase \"%1\" & pause & exit

Bu bir cazibe gibi çalışır - RegAsm dosya üzerinde çalışır ve sonuçlarını gösterir, ardından "Devam etmek için herhangi bir tuşa basın ..." istemi gösterilir, ardından bir tuşa basıldığında komut istemi penceresi kapanır.

PS İlgilenebilecek başkaları için, .dll dosyalarına bir dllfile ilişkilendirmesi ve ardından buna bir RegAsm komut uzantısı eklemek için aşağıdaki .reg dosya girdilerini kullanabilirsiniz (kaçan tırnak ve ters eğik çizgilere dikkat edin):

[HKEY_CLASSES_ROOT\.dll]
"Content Type"="application/x-msdownload"
@="dllfile"

[HKEY_CLASSES_ROOT\dllfile]
@="Application Extension"

[HKEY_CLASSES_ROOT\dllfile\Shell\RegAsm]
@="Register Assembly"

[HKEY_CLASSES_ROOT\dllfile\Shell\RegAsm\command]
@="cmd /k C:\\Windows\\Microsoft.NET\\Framework\\v4.0.30319\\regasm.exe \"%1\" /codebase \"%1\" & pause & exit"

Şimdi bir montajı kaydetmek için güzel bir sağ tıklama menüsüne sahibim.



4

İki komutu aynı anda yürütmek için, iki komut arasına bir & (ve) işareti koymanız gerekir. Şöyle ki:

color 0a & start chrome.exe

Şerefe!


4

Aynı pencerede iki ping yapmaya çalışıyorum ve aynı satırda seri bir komut. Birincisini bitirdikten sonra ikinci komutu çalıştırın.

Çözüm, start /bWindows 7 komut isteminde birleştirmekti.

Her zamanki gibi, olmadan başlayın /bve ayrı bir pencerede başlatın.

Aynı satırda başlatmak için kullanılan komut:

start /b command1 parameters & command2 parameters

Herhangi bir şekilde, çıktıyı ayrıştırmak istiyorsanız, bunu kullanmanızı önermiyorum. Çıktının komutların çıktısı arasında karıştırıldığını fark ettim.


4

İki seçeneğiniz var: Boru tesisatı veya sadece &:

DIR /S & START FILE.TXT

Veya,

tasklist | find "notepad.exe"

Piping ( |), bir komutun çıktısını almak ve diğerine koymak için daha fazladır. Ve ( &) sadece şunu çalıştırın derken.


Eğer yok bazı ne açıklama içerecek şekilde yayını düzenleyebilir misiniz &ve |yapmak ve hiç eğer, nasıl farklı? Şu anda bu kavramlara aşina olmayan insanlar, vakalarında hangisinin kullanılması gerektiğine kendileri karar veremiyorlar.
Mirek Długosz

Benim gibi. Benim hatam. Gönderiyi hemen düzenleyeceğim. Teşekkür ederim.
PyDever

Sadece "bulmak" yerine "findstr" olmalıdır
Anu Shibin Joseph Raj

2

Hayır cd / && tree && echo %time%. Yankılanma zamanı ilk komutun yürütüldüğü zamandır.

Boru tesisatının bir sorunu vardır, ancak insanlar nasıl çalıştığını bildiği sürece kritik değildir.


1

Bir örnek daha: Örneğin, gulpderleme sistemini kullandığımızda,

gulp - varsayılan> derleme

gulp build - derleme klasörü oluştur

gulp watch - dosya izlemeyi başlat

gulp dist - dağıtım klasörü oluştur

Bunu tek bir çizgi ile yapabiliriz:

cd c:\xampp\htdocs\project & gulp & gulp watch

1

Değişkenleri bir satırda kullanmaya veya değiştirmeye çalıştığınızda içeriklerine dikkat edin! Örneğin, aşağıdaki gibi bir değişken

PATH=C:\Program Files (x86)\somewhere;"C:\Company\Cool Tool";%USERPROFILE%\AppData\Local\Microsoft\WindowsApps;

aşağıdaki gibi kullanırsanız, pek çok zorlukla sonuçlanabilir %PATH%

  1. Kapanış parantezleri grup ifadenizi sonlandırır
  2. Çift tırnak %PATH%, parantez sorununu işlemek için kullanmanıza izin vermez
  3. Ve başvurulan bir değişken neleri %USERPROFILE%içerecektir?

2
Bunun, Windows CMD'de bir satırda iki komut çalıştırmayla ne ilgisi var?
Peter Mortensen


0

Kullanım &pencerelerde sembolü tek satırda komut kullanmak

C:\Users\Arshdeep Singh>cd Desktop\PROJECTS\PYTHON\programiz & jupyter notebook

kullandığımız linux gibi,

touch thisfile ; ls -lstrh

-2

Çok basit: sadece &&işaretlerle ayırt edin. Misal:

echo "Hello World" && echo "GoodBye World".

"Güle Güle Dünyası", "Merhaba Dünya" dan sonra basılacaktır.


6
Aynı şeyi gösteren eski cevaplar olduğu gerçeğinden bağımsız olarak, hala tam olarak doğru değil. koşullu&& bir
işleçse

elbette. kişi iki komutu çalıştırmak isterse bu ikisinin doğru olacağını ve böylece her şeyin iyi gideceğini
açıkça gösterir

1
Rajan: "bir sonraki komut sadece ilk komut başarılı olursa yürütülür" anlamına gelir.
Ivan

2
Baskı başarısız olmadıysa " Elveda Dünya Merhaba Dünya'dan sonra basılacaktır " Hello World. @jeb'in söylediği gibi &&şartlı. &önceki başarılı olup olmadığına bakılmaksızın komutları çalıştırır.
Pranav A.Ağustos
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.