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 kesilirseCalling 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?
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
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
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