Bir Windows toplu iş dosyasını başka bir dosyadan veya komut isteminden çağırmanın birkaç yolu. Hangi durumda hangisi?


92

Bir Windows toplu iş dosyası ( called.batveya called.cmd) başka bir toplu iş dosyasından ( caller.batveya caller.cmd) veya etkileşimli cmd.exe isteminden çeşitli şekillerde çağrılabilir :

  1. direkt Arama: called.bat
  2. çağrı komutunu kullanarak: call called.bat
  3. cmd komutunu kullanarak: cmd /c called.bat
  4. start komutunu kullanarak: start called.bat

Amaçlanan kullanımlarını yardım metinlerine göre ayırt etmekte zorlanıyorum: hangisini ne zaman kullanmalıyım? örneğin, doğrudan arama yerine neden 'ara' komutunu kullanabileceğim. Ne farkı var?

4 olasılığın tümünü (ve varsa diğerlerini) çeşitli bakış açılarından analiz eden bazı özet raporlarla ilgileniyorum: uygun olacak şekilde tasarlandıkları önerilen kullanım durumları, süreç oluşturma, yürütme bağlamı, ortam, dönüş kodu işleme.

Not: Windows XP SP3 kullanıyorum.

Yanıtlar:


101
  1. Toplu iş dosyası, geçerli cmd.exe örneği (veya örneğin, Explorer'da çift tıklandığında yeni bir cmd.exe örneği) tarafından yürütülecektir.

  2. # 1 ile aynı, yalnızca bir toplu iş / cmd dosyası içinde kullanıldığında bir etkiye sahiptir. Bir toplu iş dosyasında, 'çağrı' olmadan, ana toplu iş dosyası sona erer ve kontrol, çağrılan toplu iş dosyasına geçer; 'çağrı' ile alt toplu iş dosyasını çalıştırır ve ana toplu iş dosyası çağrıyı izleyen ifadelerle devam eder.

  3. Toplu iş dosyasını yeni bir cmd.exe örneğinde çalıştırır.

  4. Başlat, toplu iş dosyasını yeni bir pencerede yeni bir cmd.exe örneğinde çalıştıracak ve arayan, tamamlanmasını beklemeyecektir.


7
4. seçenek için not, başlat komutunun ardından her zaman bir 'başlık' gelmelidir , bu nedenle bir başlığa ihtiyacınız yoksa boş çift tırnak işaretleriniz olmalıdır, örn.start "" [options] command
Daryn

@Daryn bu bağlantı sadece her zaman bir tane olması gerektiğini söylüyor, ancak Microsoft'un parametreyi isteğe bağlı olarak tanımladığını söylüyor. Bana neden "gerekli" olduğunu söyleyemiyorlar. En alttaki örneklerinden birkaçı bile başlık parametresini atlıyor.
Adam Plocher

5

Buradaki yorumlardan net olmayan bir şey: Bir toplu iş dosyasını diğerinden yalnızca adını kullanarak çağırdığınızda (orijinal soruda Durum # 1), yürütme , çağıran toplu iş dosyasından durur . Örneğin, şu satırlarda:

called.bat
echo Hello

'Echo Hello' satırı (ve onu izleyen herhangi bir şey) çağrılmayacaktır. 'Call' anahtar sözcüğünü kullanırsanız, yürütme aramadan sonra devam eder. Yani bu durumda:

call called.bat
echo Hello

'Echo Hello' satırı çağrılacaktır.

Ek olarak, çağrılan.bat dosyasında ayarlanan tüm değişkenler de çağıran işleme geri gönderilir.

Şu satırı içeren bir 'çağrılmış.bat' dosyası düşünün:

set MYVAR=hello

Daha sonra,% MYVAR%, aşağıdaki durumlarda çağıran toplu iş dosyasında kullanılabilir olacaktır:

call called.bat

Ama kullanmayacaktı

REM starts a new cmd.exe process
start called.bat   

REM stops and replaces current cmd.exe process with a new one
called.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.