Bagaimana cara menjalankan file bat di latar belakang dari file bat lain?

92

Saya memiliki skrip "setup" yang saya jalankan di pagi hari yang menjalankan semua program yang saya butuhkan. Sekarang beberapa dari mereka membutuhkan pengaturan lingkungan tambahan, jadi saya perlu membungkusnya dalam skrip BAT kecil.

Bagaimana cara menjalankan skrip seperti itu di Windows XP di latar belakang?

CALL env-script.bat menjalankannya secara serempak, yaitu skrip pengaturan dapat dilanjutkan hanya setelah perintah dalam skrip env diakhiri.

START/B env-script.bat menjalankan contoh lain dari CMD.exe di command prompt yang sama, membiarkannya dalam keadaan yang sangat berantakan (saya melihat output dari CMD.exe bersarang, keyboard mati untuk sementara, skrip tidak dijalankan).

START/B CMD env-script.batmenghasilkan hasil yang sama. Tak satu pun dari bendera di CMD tampaknya cocok dengan tagihan saya.

Aaron Digulla
sumber

Jawaban:

72

Sebenarnya, berikut ini berfungsi dengan baik untuk saya dan membuat jendela baru:

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

Gabungkan itu dengan parameter ke start, seperti /min, seperti yang ditunjukkan Moshe jika Anda tidak ingin jendela baru muncul di depan Anda.

Joey
sumber
1
Oke, ini berfungsi tetapi tidak 100% sempurna: Setelah saya menekan "RETURN" dalam "Test 2", jendela itu tidak menutup. Ada ide?
Aaron Digulla
Anda dapat menambahkan "exit" ke kumpulan yang muncul untuk menutupnya lagi setelahnya. Maaf, tidak menguji sejauh itu :)
Joey
sebenarnya start script1.bat \ n start script2.bat \ n start scriptN.bat sudah cukup bagi saya
andrej
142

Berusia dua tahun, tapi untuk kelengkapan ...

Standar, pendekatan sebaris: (yaitu perilaku yang akan Anda dapatkan saat menggunakan &di Linux)

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

Catatan: 1. CALLdipasangkan dengan file .bat karena itu biasanya pergi .. (yaitu Ini hanya ekstensi ke CMD /C CALL "foo.bat"formulir untuk membuatnya asinkron. Biasanya, diperlukan untuk mendapatkan kode keluar dengan benar, tapi itu bukan masalah sini.); 2. Tanda kutip ganda di sekitar file .bat hanya diperlukan jika nama berisi spasi. (Nama bisa menjadi jalur dalam hal ini ada kemungkinan lebih besar dari itu.).

Jika Anda tidak menginginkan hasilnya:

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

Jika Anda ingin kelelawar dijalankan pada konsol independen: (yaitu jendela lain)

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

Jika Anda ingin jendela lain tetap ada setelahnya:

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

Catatan: Ini sebenarnya bentuk yang buruk kecuali Anda memiliki pengguna yang secara khusus ingin menggunakan jendela yang terbuka sebagai konsol normal. Jika Anda hanya ingin jendela tetap di sekitar untuk melihat hasilnya, lebih baik meletakkan a PAUSEdi akhir file bat. Atau bahkan belum, tambahkan ^& PAUSEsetelah baris perintah:

START CMD /C CALL "foo.bat" [args [...]] ^& PAUSE
antak
sumber
10
&adalah operator "dan kemudian" (terminologi?). (misalnya cmd1 & cmd2cara melakukannya "cmd1" dan kemudian "CMD2". Berbeda dengan &&operator, pelaksanaan "CMD2" tidak tergantung pada berhasil keluar dari "cmd1".) The ^lolos &sehingga masuk ke argumen CMD ini bukannya dikonsumsi dan dijalankan oleh konsol yang sama yang menjalankan START.
antak
Ini sangat membantu, terima kasih. Saya baru saja akan mem-port beberapa skrip ke Linux, karena panduan lain startdan cmdtidak memberikan fungsionalitas penuh yang saya cari. Jawaban Anda berhasil.
Iterator
3
Jika Anda tidak menginginkan keluarannya maka pengalihan harus di-escape sehingga diteruskan ke CMD. PANGGILAN juga tidak diperlukan:START /B "" CMD /C "foo.bat" [args [...]] ^>nul 2^>^&1
dbenham
1
@dbenham: Meskipun apa yang Anda katakan masuk akal, START /B "" CMD /C PING 127.0.0.1 >NULtampaknya berhasil terlepas dan tidak ada hasil. (Mungkin karena CMDmewarisi STARTpegangan I / O.) Saya rasa perbedaannya adalah jika Anda ingin menjaga START(kesalahan) keluaran tetap utuh, yang mungkin merupakan ide yang bagus. CALLhanya ada karena saya merasa ini adalah praktik yang baik untuk dipertahankan. (yaitu Tidak menggunakan CALLuntuk panggilan bat sinkron akan menghasilkan kode keluar yang tidak dapat diprediksi, jadi saya secara konsisten memasangkan panggilan bat CALLbahkan ketika itu tidak benar-benar berlaku, seperti dalam kasus ini.)
antak
7

Karena START adalah satu-satunya cara untuk mengeksekusi sesuatu di latar belakang dari skrip CMD, saya sarankan Anda tetap menggunakannya. Alih-alih pengubah / B, coba / MIN sehingga jendela yang baru dibuat tidak akan mengganggu Anda. Selain itu, Anda dapat menetapkan prioritas ke sesuatu yang lebih rendah dengan / LOW atau / BELOWNORMAL, yang akan meningkatkan daya tanggap sistem Anda.

Moshe
sumber
-1 Masalahnya adalah MULAI tidak membuat jendela baru saat Anda memulai file BAT; sebagai gantinya, ia menggunakan kembali jendela aktif dan mencampur dua proses CMD I / O.
Aaron Digulla
4
Ini tidak membuat jendela baru karena Anda menggunakan / B flag. Singkirkan.
Moshe
5

Selain istilah latar depan / latar belakang. Cara lain untuk menyembunyikan jendela yang sedang berjalan adalah melalui vbscript, jika masih tersedia di sistem Anda.

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

beri nama sebagai sth.vbs dan beri nama dari bat, masukkan tugas sheduled, dll. Secara pribadi saya akan menonaktifkan vbs tanpa terburu-buru di sistem Windows yang saya kelola :)

MEA Culpa
sumber
Untuk kasus penggunaan khusus saya, ini sebenarnya satu-satunya solusi yang saya dapat mulai bekerja ...
Ben
0

Buat aplikasi C # Windows baru dan panggil metode ini dari utama:

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();
}
LegendLength
sumber
2
Uhm ... Saya berharap bahwa sesuatu yang sederhana seperti itu tidak perlu menginstal Visual Studio ...
Aaron Digulla
1
Hingga PowerShell tersedia 100% - C # benar-benar berlebihan.
jim
2
Aaron: Kompiler C # disertakan dalam .NET Framework 2, jadi Anda cukup mengedit beberapa kode di editor teks dan mengkompilasinya. Namun, karena ini sangat mungkin dalam file batch, saya juga akan mengatakan C # berlebihan.
Joey
0

Ini berfungsi pada instalasi Windows XP Home saya, dengan cara Unix:

call notepad.exe & 
MiiToo
sumber
7
Saya pikir ini hanya bekerja secara kebetulan, dan & tidak perlu.
Sam Watkins
2
Ya, notepad.exe asinkron untuk memulai.
antak
0

Sebenarnya cukup mudah dengan opsi ini di bagian akhir:

c: \ start BATCH.bat -WindowStyle Hidden

pengguna8832474
sumber
perintah Windows starttidak memiliki -WindowStyleopsi.
Stephan
@Sthan Ditahan. Jalur aneh ( C:` instead of C: \ Windows`) menunjukkan bahwa dia menemukan alat di suatu tempat di internet dan menyalinnya ke hard drive-nya.
Aaron Digulla