2016-03-18 11 views
6

Başka bir toplu iş dosyasını (callee) çalıştıran bir toplu iş dosyası (arayan) olduğunu varsayarak, callee işlemi sona erdikten sonra arayan kişiye geri dönmek için call komutunun kullanılması gerekir.Neden bir boruya dahil olan adlandırılmış toplu komut dosyasından dönmek için `call`'a ihtiyaç duyulmuyor?

caller.bat:

echo Calling another script... 
call callee.bat 
echo Returned from callee... 

callee.bat (aynı yerde) :

echo Being called from caller... 

çıkışı, bu (komut ekolarını ihmal) olacaktır Bir örnek Yürütmenin beklendiği gibi döndüğünü gösteren:

komut arayanın içinde kesilirse
Calling another script... 
    Being called from caller... 
Returned from callee... 

, çıkış olacaktır:

Calling another script... 
    Being called from caller... 

Ama en kısa sürede Aranan bir boru katılır olarak (|), call komutunun kullanılıp kullanılmadığı konusunda hiçbir fark yoktur.

caller.bat (Aranan değişmeden kalır) : Örneğin bir call komut olsa

echo Calling another script... 
break | callee.bat 
echo Returned from callee... 

çıkışı, bu olacaktır.

Calling another script... 
    Being called from caller... 
Returned from callee... 

yürütme burada arayana dönmek neyin sebep olduğu bu davranışın nedeni, nedir?

+1

Soru şu ki, 'break | command' ve 'call command' arasında bir fark var mı? Ayrıca şunu kontrol edin 'a = b' yi ayarlayın; 'set b = c'; 'break | echo %%% %%%'. Ve ... çıktı "c" dir. Her iki durumda da, cmd'nin yeni bir alt bağlamını yaratırsınız. 'Call' kullanıldığında korunan cmd'nin bazı durumları olabilir mi? – npocmaka

+1

Oh. “REM”, “IF” ve “FOR”, pipetlendiğinde ve CALLED olduğunda farklı davranır ancak bu daha az ayrıştırmaya ayrılır. – npocmaka

+0

Hmm ... _STDOUT_'ın boruların _STDIN_'ine veri aktarımının yanı sıra, hiçbir fark gözükmüyor; cmd/C callee.bat' bile arayanı döndürür; evet, 'rem',' if' ve 'for' için özeldir, çünkü hatırlıyorum çünkü ayrıştırma işlemi sırasında diğer komutlardan daha önce tanınıyorlar ... – aschipfl

cevap

6

arayan biri (ana dosyası) dan başka bir Toplu dosyasını aramak için iki yol vardır: call callee.bat ve cmd /C callee.bat; Aradaki fark,'un diğer Toplu İş Dosyasını (), arayan programın aynı bağlamında yürütmesidir, bu nedenle aynı ortam değişkenlerini ve başka bir durumu paylaşırlar, oysa cmd /C diğer Toplu iş dosyasını tamamen ayrılmış bir bağlamda yürütür. Sadece kişisel bir not olarak, ben devralan, iç altyordamınıcall aracılığıyla çağrılan Toplu dosyası ve dış altyordamınıcmd /C (ve bindirme doğrudan call ne de cmd /C olmadan çağrılan Toplu dosya üzerinden çağrılan bir isim kullanılır arayan Batch dosyasının davranışı ve içeriği).

Bir borunun yürütülmesinde, borunun her iki tarafı bir cmd /C aracılığıyla gerçekleştirilir, böylece her iki taraf harici alt yordamlar olarak çağrılır. Bu şekilde, bir borunun herhangi bir tarafı bir Batch.BAT dosyası ise, bittiğinde arayan programına döner.

Aynı davranış, bir for /F komutunda bulunan bir aranan Toplu İş dosyasında gerçekleşir ve aynı nedenden ötürü kusurludur; for /F %%a in ('calle.bat') do ...

İlgili konular