Am'm încercat să-mi a comis-o construiască.bat
pentru a executa alte .BAT fișiere ca parte a procesului de construcție.
Conținutul de a comis-o construiască.bat
:
"msbuild.bat"
"unit-tests.bat"
"deploy.bat"
Acest lucru pare destul de simplu, dar a comis-o construiască.batexecută numai primul element din listă (
msbuild.bat`).
Am rulat fiecare dintre fișierele separat fara probleme.
Utilizare:
call msbuild.bat
call unit-tests.bat
call deploy.bat
Atunci când nu utilizați APEL, actualul lot fișier se oprește și numit fișier batch începe executarea. L's un comportament ciudat datând de la începutul MS-DOS zile.
Toate celelalte răspunsuri sunt corecte: utilizați apel. De exemplu:
call "msbuild.bat"
Istorie
În cele mai vechi versiuni DOS nu a fost posibil să recursiv executa fișiere lot. Apoi apelul comanda a fost introdus, care a chemat un alt cmd shell pentru a executa fișierul batch și s-a întors executarea înapoi la chemarea cmd shell când ați terminat.
Evident, în versiunile ulterioare nu alte cmd shell a fost necesară.
În primele zile multe fișiere lot depindea de faptul că de asteptare un lot de fișiere nu va reveni la chemarea fișier batch. Schimbarea asta de comportament, fără suplimentare de sintaxă s-ar fi rupt mai multe sisteme cum ar fi lot de sisteme de meniu (folosind fișiere lot pentru structuri de meniu).
La fel ca în multe cazuri cu Microsoft, compatibilitate, prin urmare, este motivul pentru acest comportament.
Sfaturi
Dacă ți fișiere lot au spații în numele lor, utilizați ghilimele numele:
call "unit tests.bat"
Apropo: dacă nu aveți toate numele de fișiere lot, ai putea folosi, de asemenea, pentru a face acest lucru (aceasta nu garantează ordinea corectă de fișier batch apeluri; se urmează ordinea din fișierul de sistem):
FOR %x IN (*.bat) DO call "%x"
Puteți, de asemenea, reacționează la errorlevels după un apel. Utilizare:
exit /B 1 # Or any other integer value in 0..255
pentru a da înapoi o errorlevel. 0 denotă executarea corectă. În asteptare fișier batch puteți reacționa folosind
if errorlevel neq 0 <batch command>
Folosi if errorlevel 1
daca ai un Windows mai vechi decât NT4/2000/XP pentru a prinde toate errorlevels 1 și mai mare.
Pentru a controla fluxul de un fișier batch, există goto :-(
if errorlevel 2 goto label2
if errorlevel 1 goto label1
...
:label1
...
:label2
...
Ca și altele, a subliniat: au o privire la a construi sisteme care să înlocuiască fișiere lot.
Dacă vrem să deschideți mai multe solicitările de comandă, apoi putem folosi
start cmd /k
"/k": este obligatorie care va executa.
Lansarea multe solicitările de comandă se poate face ca mai jos.
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.
Sunteți de asteptare de mai multe loturi într-un efort de a compila un program. Nu ia acordat pentru că dacă apare o eroare:
for %%b in ("msbuild.bat" "unit-tests.bat" "deploy.bat") do call %%b|| exit /b 1
'||' teste pentru un errorlevel mai mare decât 0. În acest fel toate loturile sunt numite în ordine, dar se va opri de la orice eroare, lăsând pe ecran ca acesta este pentru tine pentru a vedea orice mesaj de eroare.
Dacă avem două script-uri lot, aaa.bat și bbb.bat, și astfel de telefon de mai jos
call aaa.bat
call bbb.bat
Atunci când executarea script-ul, acesta va suna la un service.bat în primul rând, așteptați pentru firul de aaa.bat termina, și de apel bbb.bat.
Dar dacă nu't doriți să așteptați pentru aaa.bat pentru a termina pentru a apela bbb.bat, încercați să utilizați START comandă:
START ["title"] [/D path] [/I] [/MIN] [/MAX] [/SEPARATE | /SHARED]
[/LOW | /NORMAL | /HIGH | /REALTIME | /ABOVENORMAL | /BELOWNORMAL]
[/AFFINITY <hex affinity>] [/WAIT] [/B] [command/program]
[parameters]
Examen:
start /b aaa.bat
start /b bbb.bat
Uita la nume de fișiere, ai luat în considerare, folosind un instrument de a construi ca NAnt sau Ant (versiunea Java). Te'll obține o mulțime mai mult control decât cu bâta de fișiere.
Dacă doriți să deschideți mai multe fișiere lot, la o dată, puteți folosi comanda chemarea. Cu toate acestea, apelul de comandă se închide curentul fișier bat și se duce la altul. Dacă doriți să deschideți mai multe la o dată, poate doriți să încercați acest lucru:
@echo off
start cmd "call ex1.bat&ex2.bat&ex3.bat"
Și așa mai departe sau repeta începe "cmd", " "apel" ..." pentru toate acestea, mai multe fișiere. Aceasta funcționează și pentru Windows 7, dar eu nu sunt sigur despre alte sisteme.
Rularea script-uri multiple într-o singură am avut aceeasi problema. Am avut o moară pe primul nu-și dea seama că a fost ieșirea la primul script.
:: OneScriptToRunThemAll.bat
CALL ScriptA.bat
CALL ScriptB.bat
EXIT
:: ScriptA.bat
Do Foo
EXIT
::ScriptB.bat
Do bar
EXIT
Am scos toate cele 11 script-uri de linii de IEȘIRE și a încercat din nou și toate cele 11 fugit în scopul de una la un moment dat în aceeași fereastră de comandă.
:: OneScriptToRunThemAll.bat
CALL ScriptA.bat
CALL ScriptB.bat
EXIT
::ScriptA.bat
Do Foo
::ScriptB.bat
Do bar
Cu corecta referire (acest lucru poate fi dificil uneori):
start "" /D "C:\Program Files\ProgramToLaunch" "cmd.exe" "/c call ""C:\Program Files\ProgramToLaunch\programname.bat"""
1 arg - Titlu (gol în acest caz)
2 arg - /D specifică pornind de director, poate fi ommited dacă doriți curent de lucru dir (cum ar fi "%~dp0")
3-arg - comanda pentru a lansa, "cmd.exe"
4 arg - argumente la comanda, cu dublat citate pentru argumente în interiorul acestuia (acest lucru este cum să scape citate în citate în lot)