Cara menjalankan beberapa file .BAT dalam file .BAT

694

Saya mencoba membuat saya commit-build.batuntuk mengeksekusi file .BAT lainnya sebagai bagian dari proses build kami.

Isi dari commit-build.bat:

"msbuild.bat"
"unit-tests.bat"
"deploy.bat"

Ini tampaknya cukup sederhana, tetapi commit-build.bathanya mengeksekusi item pertama dalam daftar ( msbuild.bat).

Saya telah menjalankan masing-masing file secara terpisah tanpa masalah.

Yvette
sumber
4
@ Sean - Anda tidak perlu menginstal paket Cygwin lengkap untuk menjalankan utilitas baris perintah. Keluarkan semua cygwin dll dari paket, letakkan di direktori pathed, letakkan semua alat Anda di direktori pathed lain dan Anda siap melakukannya.
Techie Joe
anggap bahwa masing-masing file ini hanya batch mengapa tidak hanya meletakkannya dalam satu file besar dan menggunakan fungsi batas waktu untuk memungkinkan setiap waktu untuk memulai.
CMS_95

Jawaban:

1199

Menggunakan:

call msbuild.bat
call unit-tests.bat
call deploy.bat

Ketika tidak menggunakan CALL, file batch saat ini berhenti dan file batch yang disebut mulai dijalankan. Ini adalah perilaku aneh sejak masa MS-DOS.

Philippe Leybaert
sumber
aneh, saya sudah mencoba tanpa "panggilan" pada windows 7 dan saya ingat itu berhasil, tetapi pada windows xp diperlukan perintah ini. Mungkinkah?
pengembang android
7
Tanpa panggilan, sesuai spesifikasi DOS asli, harus melakukan perintah chaining dan TIDAK kembali. Opsi populer kembali sebelum "PANGGILAN" ditambahkan adalah untuk membuka prompt perintah anak seperti "command / c second.bat" karena itu akan kembali juga.
Brian Knoblauch
1
Saya punya masalah pada Windows 7 entreprise sehingga tidak hanya xp
Rafiki
5
Di Windows 10 hanya baris pertama yang dieksekusi. Jawaban farheen berhasil.
Robro
2
Cara meneruskan parameter ke file batch, dan salah satu param adalah path dengan spasi.
Zeus
179

Semua jawaban lain benar: gunakan panggilan. Sebagai contoh:

 call "msbuild.bat"

Sejarah

Dalam versi DOS kuno itu tidak mungkin untuk mengeksekusi file batch secara rekursif. Kemudian perintah panggilan diperkenalkan yang memanggil shell cmd lain untuk mengeksekusi file batch dan mengembalikan eksekusi ke shell cmd panggilan ketika selesai.

Jelas dalam versi yang lebih baru tidak ada lagi cmd shell yang diperlukan.

Pada hari-hari awal banyak file batch tergantung pada kenyataan bahwa memanggil file batch tidak akan kembali ke file batch panggilan. Mengubah perilaku itu tanpa sintaks tambahan akan merusak banyak sistem seperti sistem menu batch (menggunakan file batch untuk struktur menu).

Seperti dalam banyak kasus dengan Microsoft, kompatibilitas ke belakang adalah alasan untuk perilaku ini.

Kiat

Jika file batch Anda memiliki spasi dalam namanya, gunakan tanda kutip di sekitar nama:

call "unit tests.bat"

Omong-omong: jika Anda tidak memiliki semua nama file batch, Anda juga dapat menggunakan untuk melakukan ini (itu tidak menjamin urutan panggilan file batch yang benar; itu mengikuti urutan sistem file):

FOR %x IN (*.bat) DO call "%x"

Anda juga dapat bereaksi pada tingkat kesalahan setelah panggilan. Menggunakan:

exit /B 1   # Or any other integer value in 0..255

untuk mengembalikan tingkat kesalahan. 0 menunjukkan eksekusi yang benar. Dalam file batch panggilan Anda dapat bereaksi menggunakan

if errorlevel neq 0 <batch command>

Gunakan if errorlevel 1jika Anda memiliki Windows yang lebih tua dari NT4 / 2000 / XP untuk menangkap semua tingkat kesalahan 1 dan lebih besar.

Untuk mengontrol aliran file batch, ada goto :-(

if errorlevel 2 goto label2
if errorlevel 1 goto label1
...
:label1
...
:label2
...

Seperti yang ditunjukkan orang lain: lihat membangun sistem untuk mengganti file batch.

Ralph M. Rickenbach
sumber
setuju, tetapi loop bisa, dalam hal ini, memproses file dalam urutan (alfabet?) yang salah
Dave Archer
Jawaban yang bagus dan sangat lengkap. Jika Anda termasuk aliran kontrol, mungkin baik untuk dicatat bahwa alih-alih goto, Anda dapat melakukan subrutin dengan menggunakan panggilan: label1, dan pernyataan 'kembali' dalam file batch adalah goto yang agak aneh: eof (dan tidak perlu buat label diri sendiri, yang ada secara default).
Legolas
yang errorlevelcontoh perintah memberi saya masalah pada Windows 10 (di konsol cmd). Saya memodifikasi perintah menjadi sederhana if errorlevel neq echo Houston We have a Problem!. Proses batch saya tidak memiliki masalah dan sebagian besar diselesaikan secara normal, tetapi setiap langkah di mana saya menggunakan perintah ini setelah pernyataan panggilan, saya mendapat "neq tidak terduga saat ini". Berpikir mereka mungkin telah mengubah sintaks tidak-sama, saya mencoba !=dan juga <>tetapi terus mendapatkan kesalahan "tidak diharapkan saat ini" yang sama untuk sintaks baru. apa yang bisa saya lakukan salah?
TMWP
117

Jika kita ingin membuka beberapa perintah, maka kita bisa menggunakannya

start cmd /k

/k: adalah wajib yang akan dieksekusi.

Meluncurkan banyak perintah dapat dilakukan seperti di bawah ini.

start cmd /k Call rc_hub.bat 4444

start cmd /k Call rc_grid1.bat 5555

start cmd /k Call rc_grid1.bat 6666

start cmd /k Call rc_grid1.bat 5570.
Farheen
sumber
7
itulah yang kami cari, saat aplikasi pertama kami memblokir konsol, terima kasih atas petunjuknya
Michael Moeller
1
ini akan menjalankan banyak contoh perintah dan bahkan akan bekerja untuk menjalankan banyak file batch yang memiliki <pause>. +1 karena inilah solusi yang saya cari!
Christian Noel
5
dapatkah Anda menjelaskan bahwa angka-angka itu ada dalam jawaban Anda? Tujuan mereka tidak jelas.
Kalamalka Kid
3
Perhatikan bahwa kebanyakan orang mungkin ingin menggunakan start "Window title" /wait cmd /k call something.batuntuk menjalankan sesuatu dalam urutan berurutan.
Andrew
3
(atau start "Window title" /wait cmd /c something.bat, di mana cmd /cmenutup jendela setelah selesai)
Andrew
42

Mencoba:

call msbuild.bat
call unit-tests.bat
call deploy.bat
Jonathan
sumber
28

Anda memanggil banyak batch dalam upaya mengkompilasi program. Saya menerima begitu saja bahwa jika terjadi kesalahan:
1) Program dalam batch akan keluar dengan tingkat kesalahan;
2) Anda ingin tahu tentang itu.

for %%b in ("msbuild.bat" "unit-tests.bat" "deploy.bat") do call %%b|| exit /b 1

'||' menguji tingkat kesalahan lebih tinggi dari 0. Dengan cara ini semua batch dipanggil secara berurutan tetapi akan berhenti pada kesalahan apa pun, meninggalkan layar sebagaimana adanya bagi Anda untuk melihat pesan kesalahan apa pun.

Jay
sumber
23

Jika kita memiliki dua skrip batch, aaa.bat dan bbb.bat, dan panggil seperti di bawah ini

call aaa.bat
call bbb.bat

Saat menjalankan skrip, ia akan memanggil aaa.bat terlebih dahulu, tunggu utas aaa.bat berakhir, dan panggil bbb.bat.

Tetapi jika Anda tidak ingin menunggu aaa.bat untuk mengakhiri panggilan bbb.bat, coba gunakan perintah MULAI :

START ["title"] [/D path] [/I] [/MIN] [/MAX] [/SEPARATE | /SHARED]
  [/LOW | /NORMAL | /HIGH | /REALTIME | /ABOVENORMAL | /BELOWNORMAL]
  [/AFFINITY <hex affinity>] [/WAIT] [/B] [command/program]
  [parameters]

Ujian:

start /b aaa.bat
start /b bbb.bat
pengguna2314621
sumber
22
call msbuild.bat
call unit-tests.bat
call deploy.bat
ayam mentega
sumber
20

Untuk memanggil .batfile di dalam .batfile, gunakan

call foo.bat

(Ya, ini konyol, akan lebih masuk akal jika Anda bisa memanggilnya foo.bat, seperti yang Anda bisa dari command prompt, tetapi cara yang benar adalah dengan menggunakannya call.)

Zifre
sumber
7

Melihat nama file Anda, sudahkah Anda mempertimbangkan untuk menggunakan alat bangun seperti NAnt atau Ant (versi Java). Anda akan mendapatkan kontrol lebih banyak daripada dengan file bat.

Dave Archer
sumber
7

Jika Anda ingin membuka banyak file sekaligus, Anda dapat menggunakan perintah panggilan. Namun, perintah panggilan menutup file bat saat ini dan pergi ke yang lain. Jika Anda ingin membuka banyak sekaligus, Anda mungkin ingin mencoba ini:

@echo off
start cmd "call ex1.bat&ex2.bat&ex3.bat"

Dan seterusnya atau ulangi mulai cmd" call..." untuk banyak file. Ini berfungsi untuk Windows 7 , tetapi saya tidak yakin dengan sistem lain.

CMS_95
sumber
6
Start msbuild.bat
Start unit-tests.bat
Start deploy.bat

Jika itu tidak berhasil, ganti startdengan callatau coba ini:

Start msbuild.bat
Goto :1
:1
Start unit-tests.bat
Goto :2
:2
Start deploy.bat
McOussKing
sumber
3

Cukup gunakan callperintah! Berikut ini sebuah contoh:

call msbuild.bat
call unit-tests.bat
call deploy.bat
PryroTech
sumber
3

Dengan kutipan yang benar (kadang-kadang bisa rumit):

start "" /D "C:\Program Files\ProgramToLaunch" "cmd.exe" "/c call ""C:\Program Files\ProgramToLaunch\programname.bat"""

Arg 1 - Judul (kosong dalam kasus ini)
Arg 2 - - D menentukan direktori awal, dapat dihentikan jika ingin direktori kerja saat ini (seperti "% ~ dp0")
Arg 3 - perintah untuk diluncurkan, "cmd.exe"
4th arg - argumen untuk diperintahkan, dengan tanda kutip dua kali lipat untuk argumen di dalamnya (ini adalah bagaimana Anda menghindari tanda kutip dalam tanda kutip dalam batch)

robertcollier4
sumber
2

Menjalankan banyak skrip dalam satu saya memiliki masalah yang sama. Saya terus membiarkannya mati pada yang pertama tidak menyadari bahwa itu keluar pada skrip pertama.

:: OneScriptToRunThemAll.bat
CALL ScriptA.bat
CALL ScriptB.bat
EXIT

:: ScriptA.bat
Do Foo
EXIT
::ScriptB.bat
Do bar
EXIT

Saya menghapus semua 11 dari skrip EXIT saya dan mencoba lagi dan semua 11 berjalan secara berurutan di jendela perintah yang sama.

:: OneScriptToRunThemAll.bat
CALL ScriptA.bat
CALL ScriptB.bat
EXIT

::ScriptA.bat
Do Foo

::ScriptB.bat
Do bar
John Oliphant
sumber
jangan menghapus exits, gantilah dengan goto :eof. Ini akan "kembali" kecall
Stephan
Anda menyadari bahwa dalam batch perintah sederhana akan berjalan dalam urutan yang disebut juga tata letak dasar untuk @echo off :menu some commands goto menucatatan ini akan menjalankan loop terus menerus sampai ditutup. pada dasarnya Anda tidak perlu ::hanya:
CMS_95
0

Berikut ini memecahkan masalah saya:

start call "batch1.bat"
start call "batch2.bat"
Quinn
sumber
0

Mungkin Anda menginginkan ini:

Jalankan skrip batch secara paralel-

start "systemLogCollector" /min cmd /k call systemLogCollector.bat
start "uiLogCollector" /min cmd /k call uiLogCollector.bat
start "appLogCollector" /min cmd /k call appLogCollector.bat

Di sini tiga file batch dijalankan pada jendela perintah terpisah dalam keadaan minimal. Jika Anda tidak ingin mereka diperkecil, maka hapus /min. Juga, jika Anda tidak perlu mengontrolnya nanti, maka Anda bisa menyingkirkan judulnya. Jadi, perintah tanpa tulang akan menjadi-start cmd /k call systemLogCollector.bat


Jika Anda ingin mengakhiri mereka-

taskkill /FI "WindowTitle eq appLogCollector*" /T /F
taskkill /FI "WindowTitle eq uiLogCollector*" /T /F
taskkill /FI "WindowTitle eq systemLogCollector*" /T /F
Minhas Kamal
sumber