2011-08-04 43 views
5

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

+0

bazı kod gönderir misiniz? Senin sorunun ne olduğu belli değil. – steenhulthin

+0

Diğer grupları başlatmak için 'call ...' kullanıyor musunuz? – woohoo

cevap

1

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

+1

Yani, ÇAĞRI olmadan, CALL ile olduğu kadar bekler, ancak sadece… sonlandırır. :) –

+0

@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

+0

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

7

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 
+1

@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

+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

+0

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. –