web-gelistirme-sc.com

Satıra "çağrı" yapmadan iç içe geçmiş bir toplu iş dosyasını çağırmak neden üst toplu iş dosyasından çıkar?

İç içe toplu iş dosyalarını call komutunu kullanarak bir üst dosyadan nasıl arayacağımı biliyorum, çünkü bu konuda çok fazla kaynak var:

Ancak, anlamıyorum why başkasından başka bir toplu iş dosyasını çağırmak üst öğeyi sonlandırıyor.

Daha az soyut bir örnek için, ayrı toplu iş dosyalarını "birbirine bağlayan" bir toplu iş dosyasına sahip olduğumu ve I yanlış bir şekilde her satıra call hazırlamadığını varsayalım:

foo.bat
bar.bat

Bu sadece foo.bat dosyasını çalıştırır ve çıkar. Her iki komutu da doğru şekilde yürütmek için, her ifadeden önce bir çağrı hazırlamam gerekir:

call foo.bat
call bar.bat

İlk işlevsellik neden hala var? Neden değişmedi? call'nin 1980'lerin sonlarında piyasaya sürülen MS-DOS 3.3'te tanıtıldığını fark ettim, bu işlev hala ters uyumluluk için burada mı?

Herhangi bir (pratik) kullanımı düşünemiyorum, ama belki de "yeni" programlama tekniklerine alışkınım.

29
Brandon Amos

DOS, basit metin işlemeyi kullandı ( 20 dosya tanıtıcılarına izin vermek için config.sys'de FILES=20 gibi şeyler olduğunda), bu nedenle dosyayı açtı, bir sonraki satırı oku, dosyayı kapattı, sonra da sadece oku. Dosya başka bir yerde çağrılırsa, işlem bu dosyayla devam etti, böylece bir toplu iş dosyası için yalnızca 1 dosya tanıtıcısı gerekli olacaktır. 

Microsoft, call komutunu girinceye kadar, orijinal dosyaya geri dönmenin bir yolu yoktu (önceki dosyanın adını parametre olarak vermek gibi hileler kullanmak ve orijinal toplu iş dosyasının kubbesi olduğunu bildirmek için geçici dosyaları kullanmak gibi) işleniyor ve daha sonra GOTO dosyasının bir sonraki parçası olabilir.

31
SeanC

Sean Cheshire'ın yazdığı gibi geriye dönük uyumluluk için gereklidir. 

Ancak bir toplu iş dosyasını CALL kullanmadan bir toplu iş dosyasından başlatmak üst öğeyi sonlandırmaz!
Bu şekilde görünüyor, çünkü ebeveyn normalde ikinci parti çıktıktan sonra daha fazla çalıştırılmayacak.
Fakat ikinci.bat'a başlamadan önce bir çağrı kullanmak ilk partinin sonlandırılmadığını gösterecektir.

parent.bat  

echo parent.bat
call :myLabel
echo back in parent.bat main
exit /b

:myLabel
second.bat & echo back in parent.bat
exit /b

second.bat

echo second.bat
exit /b

Burada cms.exe başka bir hata/özelliği önlemek için secpond.bat & echo back ... kullanın.
Eğer ekstralar olmadan second.bat kullanırsanız, second.batVE/ :myLabel içindeki second.bat etiketine atlar!

7
jeb

Call temel olarak "git, bu diğer toplu dosyayı çalıştır ve sonra buraya geri dön ve devam et" der. DOS 3.3'ten bu yana oradaydı ve şimdi çıkarıldıysa geriye dönük uyumlulukları kıracak (bu yüzden insanlar hala toplu komut dosyaları kullanıyorlardı). :link konumlarına dallanmak için de kullanılabilir.

Kullanım ve sözdizimi hakkında bilgi almak için (diğerleri için gelecekteki referanslar için) bunu görebilirsiniz MS TechNet link

Yeni bir işlevselliğe ihtiyacınız varsa, bunun yerine CMD komut dosyalarını veya PowerShell komut dosyalarını kullanın.

0
Ken White