Diğer toplu iş dosyalarını başlatan bir Windows toplu iş dosyası var. İlk parti içinde herhangi bir şey yapmadan önce diğer tüm parti dosyalarını bitirmeyi nasıl beklerim? Kullanamıyorum/bekle çünkü paralel çalışacak diğer komutlara ihtiyacım var.Komutların Sonlanmasını Bekleyin
cevap
Benim önerim CALL
komutunu kullanmaktır. Batch Files bir örnek:
Batch1.bat listeleme:
REM Batch1.bat
SET ABC=1
CALL BATCH2.BAT %ABC%
ECHO ABC = %ABC%
BATCH2.BAT %ABC%
ECHO ABC = %ABC%
Batch2.bat listesidir:
REM Batch2.bat
SET ABC=%ABC%%1
DÜZENLEME: burada @Andriy M, gelen geri bildirimlere dayanarak iki toplu iş için geliştirilmiş bir sürümdür:
Batch 1:
@ECHO OFF
REM Batch1.bat
SET ABC=1
CALL batch2.bat %ABC%
ECHO 1. ABC = %ABC%
CALL batch2.bat %ABC% REM test this line with CALL and without
ECHO 2. ABC = %ABC%
* Grup 2:
@ECHO OFF
REM Batch2.bat
SET tmout=5
echo sleeping %tmout% seconds...
REM this introduces a timeout by using a nonexistent ip address
PING 1.2.1.2 -n 1 -w %tmout%000 > NUL
echo done sleeping
SET ABC=%ABC%%1
Ben CALL ve olmadan açıklama testi bu satırı yazdı Batch1 çizgiyi bakın. Bu grubu iki kez çalıştırın, bu çizgi CALL
ve CALL
olmadan.
konsoldan çıktısında
CALL
olmadan: şimdi C:\temp>batch1.bat
sleeping 5 seconds...
done sleeping
1. ABC = 11
sleeping 5 seconds...
done sleeping
VeCALL
ile konsoldan çıktısı:
C:\temp>batch1.bat
sleeping 5 seconds...
done sleeping
1. ABC = 11
sleeping 5 seconds...
done sleeping
2. ABC = 1111
farkı Lütfen dikkat: 2 yankı olsun quod erat demonstrandum
Yani, ÇAĞRI olmadan, CALL ile olduğu kadar bekler, ancak sadece… sonlandırır. :) –
@Andriy M: Şimdiye kadar yaşadığıma dayanarak, yani ** değil ** yani, ÇAĞRI olmadan - yürütme, bir sonraki satıra derhal, aranan toplu/komutun bitmesini beklemeden hemen geri dönüyor (belki de Bunu uzun operasyonlarla denemelisiniz). – woohoo
Bu çok tuhaf ki çok örnek senaryolarınızı kullanarak beklentimi doğrulamak zorunda kaldım. Windows 7 SP1'deki ilk komut dosyasını komut isteminden çalıştırdım ve iki betik benim için çalıştığını düşündüğüm gibi çalıştı, yani.batch2.bat'dan sonra yürütme işlemi ikinci kez çağrıldığında sonlandırıldı. Yani, batch1.bat' son satırı yürütmedi. CALL olmadan yürütmenin ilk partiye geri döndüğünü ve beklemeden söylediğinizi söylediniz? –
Her Batch dosyası için bir tane olmak üzere birkaç bayrak dosyası kullanabilirsiniz. Örneğin: (... Flagfile.2,) aynı şekilde
ana dosyanın eşzamanlı toplu dosyaların geri kalanını
İlk toplu iş dosyası girdiğinizde Flagfile.1 oluşturmak ve sonundan önce silin ve sadece tüm bayrak dosyalarının kaybolmasını beklemek zorundadır. Örneğin, Ana dosyasında: Herhangi Toplu dosyasında
start Batch1
start Batch2
.....
:wait
if exist flagfile.* goto wait
, örnek Batch1 için:
echo %time% > flagfile.1
echo Do my process...
del flagfile.1
exit
@woohoo: Afedersiniz, bence burada bir tartışma var. Soru, ebeveynlere devam etmeden önce tüm çocukların paralel olarak Batch'es'in nasıl biteceğini beklemek. Bu sorunu ÇAĞRI aracılığıyla, ancak START aracılığıyla çözmenin bir yolu yoktur. Kadro dediği gibi,/WAIT kullanamaz, bu bir START komutu seçeneğidir. Çözüm, ebeveyn Batch dosyasının tüm çocuklarının ne zaman biteceğini bilmesini sağlayan bir semafor sistemini uygulamaktır. Bir dosyanın varlığına dayalı olarak çok basit bir semafor sistemi önerdim, ancak bu mükemmel bir şekilde çalışmalı. Peki neden cevabım reddedildi? :-( – Aacini
+1, Neden aşağı oylama, özellikle bu soruya cevap veren tek cevap bu yana. Ana dosyaya sahip olmanın daha iyi olması bayrak bayrağını oluşturuyor ... Ana komutlar, çocuk süreçleri başlatılmadan önce test etmeye başlayabilir. – dbenham
LOVE this! VS'te, her bir servis projesinin post-build etkinliğinde, her birinin basit bir referans referansını içeren bir başka projede saklamak için her birinin * .cs referans dosyasını indirmek üzere 'CALL' kullanıyoruz. BAŞLAT/b/'ve hepsini aynı anda, aynı pencerede, birbirini etkilemediğimi farkettim. Çok tatlıyım. O zaman, ben her şeyi tamamladıktan sonra "MSBuild" i nasıl kullanabilirim? hizmet projesini bu yüzden montajına referans veren projeler otomatik olarak güncellenir. –
bazı kod gönderir misiniz? Senin sorunun ne olduğu belli değil. – steenhulthin
Diğer grupları başlatmak için 'call ...' kullanıyor musunuz? – woohoo