Başka bir yarasa dosyasından arka planda bir yarasa dosyasını nasıl çalıştırırım?


92

İhtiyacım olan tüm programları başlatan sabah çalıştırdığım bir "kurulum" komut dosyam var. Şimdi bunlardan bazılarının ek ortam kurulumuna ihtiyacı var, bu yüzden onları küçük BAT komut dosyalarına bağlamam gerekiyor.

Windows XP'de arka planda böyle bir komut dosyasını nasıl çalıştırırım?

CALL env-script.bat bunu eşzamanlı olarak çalıştırır, yani kurulum betiği ancak env-betiğindeki komut sonlandırıldıktan sonra devam edebilir.

START/B env-script.bat CMD.exe'nin başka bir örneğini aynı komut isteminde çalıştırarak onu gerçekten dağınık bir durumda bırakıyor (iç içe geçmiş CMD.exe'nin çıktısını görüyorum, klavye bir süre bitmiş, komut dosyası çalıştırılmıyor).

START/B CMD env-script.bataynı sonucu verir. CMD'deki işaretlerin hiçbiri faturama uymuyor.

Yanıtlar:


72

Aslında, aşağıdakiler benim için iyi çalışıyor ve yeni pencereler oluşturuyor:

test.cmd:

@echo off
start test2.cmd
start test3.cmd
echo Foo
pause

test2.cmd

@echo off
echo Test 2
pause
exit

test3.cmd

@echo off
echo Test 3
pause
exit

Yeni pencerelerin önünüzde ortaya çıkmasını istemiyorsanız, bunu Moshe'nin belirttiği startgibi parametrelerle birleştirin /min.


1
Tamam, bu işe yarıyor ama% 100 mükemmel değil: "Test 2" de "RETURN" e bastıktan sonra bu pencere kapanmıyor. Herhangi bir fikir?
Aaron Digulla

Daha sonra tekrar kapatmak için, oluşan gruplara "çıkış" ekleyebilirsiniz. Maalesef o kadar test etmedim :)
Joey

aslında script1.bat \ n start script2.bat \ n start scriptN.bat başlatmak benim için yeterliydi
andrej

142

İki yaşında, ama bütünlük için ...

Standart, satır içi yaklaşım: (yani &Linux'ta kullanırken elde edeceğiniz davranış )

START /B CMD /C CALL "foo.bat" [args [...]]

Notlar: 1. CALL.bat dosyasıyla eşleştirilir çünkü genellikle oraya gider .. (ör. Bu yalnızcaCMD /C CALL "foo.bat" formun eşzamansız hale getirilmesi . Genellikle, çıkış kodlarını doğru bir şekilde almak gerekir, ancak bu bir sorun değildir buraya.); 2. .bat dosyası çevresinde çift tırnak işaretleri yalnızca ad boşluk içeriyorsa gereklidir. (İsim bir yol olabilir ve bu durumda daha fazla olasılık vardır.)

Çıkışı istemiyorsanız:

START /B CMD /C CALL "foo.bat" [args [...]] >NUL 2>&1

Yarasanın bağımsız bir konsolda çalıştırılmasını istiyorsanız: (yani başka bir pencere)

START CMD /C CALL "foo.bat" [args [...]]

Diğer pencerenin daha sonra takılmasını istiyorsanız:

START CMD /K CALL "foo.bat" [args [...]]

Not: Açık pencereyi özellikle normal bir konsol olarak kullanmak isteyen kullanıcılar olmadıkça bu aslında kötü bir formdur. Çıktıyı görmek için pencerenin etrafta kalmasını istiyorsanız PAUSE, yarasa dosyasının sonuna bir a koymak daha iyidir . Ya da henüz ^& PAUSEkomut satırından sonra ekleyin :

START CMD /C CALL "foo.bat" [args [...]] ^& PAUSE

10
&bir "ve sonra" (terminoloji?) operatörüdür. (örneğin cmd1 & cmd2, "cmd1" ve ardından "cmd2" anlamına gelir. &&Operatörün aksine, "cmd2" nin yürütülmesi "cmd1" in başarılı çıkışına bağlı değildir.) Harcanmak yerine CMD'nin argümanlarına girecek şekilde ^kaçar. &ve START'ı çalıştıran aynı konsol tarafından çalıştırılır.
antak

Bu çok yardımcı oldu, teşekkürler. Bazı komut dosyalarını Linux'a taşımak üzereydim, çünkü diğer kılavuzlar aradığım tam işlevselliği vermedi startve cmdvermedi. Cevabınız çivileniyor.
Yineleyici

3
Çıkışı istemiyorsanız, CMD'ye iletilmesi için yeniden yönlendirme öncelenmelidir. Ayrıca CALL gerekli değildir:START /B "" CMD /C "foo.bat" [args [...]] ^>nul 2^>^&1
dbenham

1
@dbenham: Söyledikleriniz mantıklı olsa da, START /B "" CMD /C PING 127.0.0.1 >NULişe yarıyor gibi görünüyor ve hiçbir şey çıktı değil. (Muhtemelen I / O tanıtıcılarını CMDdevraldığı için START.) Sanırım aradaki fark, START's (hata) çıktısını olduğu gibi tutmak istemenizdir , bu muhtemelen iyi bir fikirdir. CALLsadece orada çünkü bunu sürdürmenin iyi bir uygulama olduğunu düşündüm. (yani CALL, senkronize yarasa çağrılarını kullanmamak , tahmin edilemeyen çıkış kodlarına neden olur, bu nedenle CALL, bu durumda olduğu gibi, tam olarak geçerli olmadığında bile, yarasa çağrılarını tutarlı bir şekilde eşleştiriyorum .)
antak

7

START, bir CMD betiğinden arka planda bir şey yürütmenin tek yolu olduğundan, kullanmaya devam etmenizi tavsiye ederim. / B değiştiricisi yerine, / MIN'ı deneyin, böylece yeni oluşturulan pencere sizi rahatsız etmez. Ayrıca / DÜŞÜK veya / AŞAĞI ORMAL ile önceliği daha düşük bir değere ayarlayabilirsiniz, bu da sistem yanıt verme hızınızı artıracaktır.


-1 Sorun, bir BAT dosyasını başlattığınızda START'ın yeni bir pencere oluşturmamasıdır; bunun yerine mevcut pencereyi yeniden kullanır ve G / Ç iki CMD işlemini karıştırır.
Aaron Digulla

4
/ B bayrağını kullandığınız için yeni bir pencere oluşturmuyor. Onu kaldır.
Moshe

5

Ön plan / arka plan terimi dışında. Çalışan pencereyi gizlemenin başka bir yolu, sisteminizde hala mevcutsa vbscript aracılığıyladır.

DIM objShell
set objShell=wscript.createObject("wscript.shell")
iReturn=objShell.Run("yourcommand.exe", 0, TRUE)

sth.vbs olarak adlandırın ve yarasa çağırın, atılmış görev koyun, vb. Şahsen yönettiğim herhangi bir Windows sisteminde acele etmeden vbs'yi devre dışı bırakacağım :)


Benim özel kullanım durumum için, aslında işe yarayabileceğim tek çözüm
Ben

0

Yeni bir C # Windows uygulaması oluşturun ve bu yöntemi main'den çağırın:

public static void RunBatchFile(string filename)
{
    Process process = new Process();

    process.StartInfo.FileName = filename;

    // suppress output (command window still gets created)
    process.StartInfo.Arguments = "> NULL";

    process.Start();
    process.WaitForExit();
}

2
Uhm ... Bu kadar basit bir şeyin Visual Studio'yu yüklemeye ihtiyaç duymayacağını umuyordum ...
Aaron Digulla

1
PowerShell% 100 kullanılabilir olana kadar - C # gerçekten aşırıdır.
jim

2
Aaron: C # derleyicisi .NET Framework 2'ye dahil edilmiştir, bu nedenle bir metin düzenleyicide bazı kodları düzenleyebilir ve derleyebilirsiniz. Yine de, bu bir toplu iş dosyasında mükemmel şekilde mümkün olduğundan C # 'ın aşırı olduğunu söyleyebilirim.
Joey

0

Bu, Windows XP Home kurulumumda Unix yolu ile çalışır:

call notepad.exe & 

7
Bunun sadece tesadüfen işe yaradığını düşünüyorum ve & gerekli değil.
Sam Watkins

2
Evet, notepad.exe başlangıç ​​için zaman uyumsuzdur.
antak

0

Aslında bu seçenek sonunda oldukça kolay:

c: \ start BATCH.bat -WindowStyle Gizli


Windows komutunun startbir -WindowStyleseçeneği yoktur.
Stephan

@Stephan Arreed. Garip yol ( C:` instead of C: \ Windows`) internette bir yerde bir araç bulduğunu ve sabit diskine kopyaladığını gösteriyor.
Aaron Digulla
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.