Hoe kan ik meerdere .BAT-bestanden uitvoeren binnen een .BAT-bestand

Ik probeer mijn commit-build.batandere .BAT-bestanden te laten uitvoeren als onderdeel van ons bouwproces.

Inhoud van commit-build.bat:

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

Dit lijkt eenvoudig genoeg, maar commit-build.batvoert alleen het eerste item in de lijst uit (msbuild.bat).

Ik heb elk van de bestanden afzonderlijk zonder problemen uitgevoerd.


Antwoord 1, autoriteit 100%

Gebruik:

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

Als CALL niet wordt gebruikt, stopt het huidige batchbestand en wordt het aangeroepen batchbestand uitgevoerd. Het is een eigenaardig gedrag dat teruggaat tot de vroege MS-DOS-dagen.


Antwoord 2, autoriteit 15%

Alle andere antwoorden zijn correct: gebruik bellen. Bijvoorbeeld:

call "msbuild.bat"

Geschiedenis

In oude DOS-versies was het niet mogelijk om batchbestanden recursief uit te voeren. Vervolgens werd de call-opdracht geïntroduceerd die een andere cmd-shell aanriep om het batchbestand uit te voeren en de uitvoering terugstuurde naar de aanroepende cmd-shell wanneer deze klaar was.

Het is duidelijk dat in latere versies geen andere cmd-shell meer nodig was.

Vroeger waren veel batchbestanden afhankelijk van het feit dat het aanroepen van een batchbestand niet zou terugkeren naar het oproepende batchbestand. Het veranderen van dat gedrag zonder extra syntaxis zou veel systemen hebben gebroken, zoals batchmenusystemen (batchbestanden gebruiken voor menustructuren).

Zoals in veel gevallen bij Microsoft, is achterwaartse compatibiliteit daarom de reden voor dit gedrag.

Tips

Als uw batchbestanden spaties in hun naam hebben, gebruik dan aanhalingstekens rond de naam:

call "unit tests.bat"

Trouwens: als je niet alle namen van de batchbestanden hebt, kun je ook for gebruiken om dit te doen (het garandeert niet de juiste volgorde van batchbestandaanroepen; het volgt de volgorde van het bestandssysteem) :

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

Je kunt ook na een oproep reageren op foutniveaus. Gebruik:

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

om een foutniveau terug te geven. 0 staat voor correcte uitvoering. In het aanroepende batchbestand kunt u reageren met

if errorlevel neq 0 <batch command>

Gebruik if errorlevel 1als je een oudere Windows hebt dan NT4/2000/XP om alle errorlevels 1 en hoger op te vangen.

Om de stroom van een batchbestand te regelen, is er goto 🙁

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

Zoals anderen al zeiden: kijk eens naar het bouwen van systemen om batchbestanden te vervangen.


Antwoord 3, autoriteit 10%

Als we meerdere opdrachtprompts willen openen, kunnen we

start cmd /k

/k: is verplicht en wordt uitgevoerd.

Het starten van veel opdrachtprompts kan als volgt worden gedaan.

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.

Antwoord 4, autoriteit 3%

Probeer:

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

Antwoord 5, autoriteit 2%

Je roept meerdere batches aan in een poging een programma te compileren.
Ik neem aan dat als er een fout optreedt:
1) Het programma binnen de batch wordt afgesloten met een foutniveau;
2) Je wilt er meer over weten.

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

‘||’ tests voor een foutniveau hoger dan 0. Op deze manier worden alle batches in volgorde aangeroepen, maar stoppen ze bij elke fout, waardoor het scherm blijft zoals het is voor u om eventuele foutmeldingen te zien.


Antwoord 6, autoriteit 2%

Als we twee batchscripts hebben, aaa.bat en bbb.bat, en aanroepen zoals hieronder

call aaa.bat
call bbb.bat

Als het script wordt uitgevoerd, roept het eerst aaa.bat aan, wacht tot de thread van aaa.bat wordt beëindigd en roept bbb.bat aan.

Maar als je niet wilt wachten tot aaa.bat is beëindigd om bbb.bat te bellen, probeer dan de STARTcommando:

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

Antwoord 7, autoriteit 2%

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

Antwoord 8, autoriteit 2%

Om een .bat-bestand binnen een .bat-bestand aan te roepen, gebruik je

call foo.bat

(Ja, dit is dwaas, het zou logischer zijn als je het zou kunnen aanroepen met foo.bat, zoals je zou kunnen vanaf de opdrachtprompt, maar de juiste manier is om call.)


Antwoord 9

Start msbuild.bat
Start unit-tests.bat
Start deploy.bat

Als dat niet werkt, vervang dan startdoor callof probeer dit:

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

Antwoord 10

Als je naar je bestandsnamen kijkt, heb je overwogen om een build-tool te gebruiken zoals NAntof Ant (de Java-versie ). Je krijgt veel meer controle dan met bat-bestanden.


Antwoord 11

Als u veel batchbestanden tegelijk wilt openen, kunt u het call-commando gebruiken. De call-opdracht sluit echter het huidige bat-bestand en gaat naar een ander. Als je er veel tegelijk wilt openen, kun je dit proberen:

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

Enzovoort of herhaal start cmdcall…” voor hoeveel bestanden dan ook. Dit werkt voor Windows 7, maar ik ben niet zeker van andere systemen.


Antwoord 12

Eenvoudigste manier om meerdere batchbestanden parallel uit te voeren

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

running-meerdere-batch-bestanden
Hier worden drie batchbestanden uitgevoerd op afzonderlijke opdrachtvensters in een geminimaliseerde staat. Als je niet wilt dat ze geminimaliseerd worden, verwijder dan /min. Als je ze later niet meer hoeft te beheren, kun je de titels verwijderen. Dus een kale opdracht zal zijn- start cmd /k call systemLogCollector.bat


Als je ze wilt beëindigen, voeg dan deze commando’s toe-

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

Antwoord 13

Met correct citeren (dit kan soms lastig zijn):

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

1e argument – Titel (leeg in dit geval)
2e arg – /D specificeert de startmap, kan worden weggelaten als u de huidige werkmap wilt (zoals “%~dp0”)
3e arg – commando om te starten, “cmd.exe”
4e arg – argumenten om te bevelen, met dubbele aanhalingstekens voor de argumenten erin (zo ontsnap je aan aanhalingstekens in aanhalingstekens in batch)


Antwoord 14

Als ik meerdere scripts in één uitvoerde, had ik hetzelfde probleem. Ik bleef het bij het eerste laten sterven, niet beseffend dat het bij het eerste script werd afgesloten.

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

Ik heb alle 11 EXIT-regels van mijn script verwijderd en het opnieuw geprobeerd en alle 11 werden in volgorde één voor één uitgevoerd in hetzelfde opdrachtvenster.

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

Antwoord 15

Gebruik gewoon de opdracht call! Hier is een voorbeeld:

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

Antwoord 16

Ik weet dat ik een beetje laat op het feest ben, maar hier is een andere manier. Dat wil zeggen, deze methode moet wachten tot de eerste klaar is, de tweede, enzovoort.

start "" /wait cmd.exe /c msbuild.bat
start "" /wait cmd.exe /c unit-tests.bat
start "" /wait cmd.exe /c deploy.bat

Het enige probleem dat het gebruik van deze methode kan opleveren, is dat met nieuwe exemplaren van cmd.exe die worden gegenereerd, de controle op foutniveau binnen elk exemplaar van cmd.exe wordt gehouden.

Of…

start "" /wait call msbuild.bat
start "" /wait call unit-tests.bat
start "" /wait call deploy.bat

Hopelijk helpt dit.


Antwoord 17

Uw script zou moeten zijn:

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

Other episodes