Ik probeer mijn commit-build.bat
andere .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.bat
voert 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 1
als 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 start
door call
of 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 cmd
“call
…” 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
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"