Valószínűleg mindenki találkozott már azzal a helyzettel, amikor egy feladat elvégzéséhez több programot kell egymás után futtatni, de az egyik csak akkor indulhat el, ha az előző már befejeződött. Legyen szó szoftverfrissítésről, adatbázis-mentésről, fájlkonverzióról vagy összetett build-folyamatról, a szekvenciális programfuttatás kritikus fontosságú. A Windows parancssora, a CMD (Command Prompt), első pillantásra talán régimódinak tűnhet, de rendkívül erőteljes és sokoldalú eszköz az ilyen típusú automatizáláshoz. Cikkünkben felfedjük, hogyan válhatunk a programok egymás utáni, kontrollált indításának mesterévé, létrehozva a tökéletes batch szkriptet.
Sok felhasználó számára az automatizálás első lépése egyszerűen az, hogy sorban leírja a parancsokat egy .bat fájlba. Ez azonban gyakran csalódáshoz vezet, hiszen a CMD alapesetben nem várja meg egy grafikus alkalmazás (GUI program) befejezését, hanem azonnal ugrik a következő sorra. Ekkor jön a képbe a CMD szkript valódi ereje és az a néhány kulcsfontosságú parancs, amelyek segítségével valóban kontrollálhatjuk a folyamatok áramlását.
Az Alapok: Miért Nem Elég a Sima Parancssor?
Kezdjük azzal a forgatókönyvvel, ami sok kezdő automatizálót zavarba hoz. Tegyük fel, hogy van két programunk: program1.exe
és program2.exe
. Szeretnénk, ha program1.exe
lefutna, és csak utána indulna el program2.exe
. Ha csak egyszerűen beírjuk a batch fájlba:
program1.exe
program2.exe
…akkor gyakran azt tapasztaljuk, hogy program2.exe
azonnal elindul, amint program1.exe
elindult – nem pedig akkor, amikor befejeződött. Ez azért van, mert a CMD a legtöbb esetben aszinkron módon kezeli a GUI alkalmazásokat. Elindítja, majd azonnal továbblép. Ez a viselkedés nem ideális, ha függőségeink vannak.
A Megoldás Kulcsa: START /WAIT és CALL
A jó hír az, hogy a CMD fejlesztői gondoltak erre a problémára, és két beépített parancsot is adtak a kezünkbe, amelyekkel áthidalhatjuk ezt az akadályt. Ezek a START /WAIT
és a CALL
.
START /WAIT
: A Programok Várólistája [⏳]
A START /WAIT
parancs a legfontosabb eszközünk, ha egy program befejezését meg kell várni. Ahogy a neve is sugallja, elindít egy programot, és a parancssor addig nem hajtja végre a következő parancsot, amíg az elindított alkalmazás be nem fejeződött. Ez magában foglalja a felhasználói bezárást, vagy az alkalmazás saját leállását.
START /WAIT "Szekvenciális futtatás" "C:Utvonalprogram1.exe" argumentumok
echo Program1 befejeződött.
START /WAIT "Szekvenciális futtatás" "C:Utvonalprogram2.exe" argumentumok
echo Program2 befejeződött.
[💡 Tipp:] A START
parancs első, idézőjelek közé tett paramétere a konzolablak címe lesz. Ezt mindig érdemes megadni, még akkor is, ha nincs külön érték, különben a program nevét próbálja ablakcímként értelmezni, ami hibához vezethet, ha az program neve idézőjelet tartalmaz. Célszerű egy leíró nevet adni neki, például „Feladat Futtatás” vagy a program nevét. Az idézőjelek itt elengedhetetlenek.
Ez a módszer tökéletesen alkalmas GUI alkalmazások indítására és megvárására. Gondoljunk például egy telepítőre, amelynek végig kell futnia, mielőtt a konfigurációs szkript elindulna. A START /WAIT
biztosítja, hogy a telepítés befejeződjön, mielőtt a szkript továbblépne a beállításokra.
CALL
: Batch Fájlok Egymásutánisága [➡️]
Ha nem egy .exe fájlt, hanem egy másik batch fájlt (.bat
vagy .cmd
) szeretnénk futtatni és megvárni annak befejezését, akkor a CALL
parancs a megfelelő választás. Ha egyszerűen beírnánk a másik batch fájl nevét (pl. masik_script.bat
), a fő szkriptünk befejeződne, és átadná a vezérlést a hívott szkriptnek, ami nem kívánt viselkedés.
CALL C:Utvonalelso_feladat.bat argumentumok
echo Az első feladat (batch) befejeződött.
CALL C:Utvonalmasodik_feladat.bat argumentumok
echo A második feladat (batch) befejeződött.
A CALL
parancs a hívott batch fájl befejezése után visszatér a hívó szkriptbe, és ott folytatódik a végrehajtás. Ez rendkívül hasznos moduláris szkriptek építésénél, ahol a nagyobb feladatot kisebb, önállóan is futtatható egységekre bontjuk.
Várakozás Időre vagy Felhasználói Beavatkozásra [⏱️]
Néha nem egy program befejezését kell megvárnunk, hanem egyszerűen egy bizonyos időt szeretnénk kihagyni, vagy a felhasználó beleegyezését várjuk. Erre is van megoldásunk:
TIMEOUT /T X /NOBREAK
: Szünet Beiktatása
A TIMEOUT
parancs lehetővé teszi, hogy a szkript megadott másodpercig várakozzon. A /T
kapcsolóval adjuk meg a másodpercek számát, a /NOBREAK
pedig megakadályozza, hogy egy billentyűleütés megszakítsa a várakozást.
echo A mentés elkészült. Két perc múlva indul a tömörítés.
TIMEOUT /T 120 /NOBREAK
echo Indul a tömörítés...
Ez hasznos lehet, ha például egy hálózati erőforrásnak adunk időt, hogy elérhetővé váljon, vagy egyszerűen csak egy rövid „pihenőt” szeretnénk beiktatni a lépések között.
PAUSE
: Felhasználói Interakció
Ha a felhasználónak kell döntenie, mikor folytatódik a szkript, a PAUSE
parancs a legegyszerűbb megoldás. Ez kiírja, hogy „Press any key to continue…” és megállítja a végrehajtást, amíg a felhasználó nem nyom meg egy gombot.
echo Kérjük, ellenőrizze a beállításokat, majd folytassa.
PAUSE
echo Folytatás...
Ez jól jön, ha például egy kritikus lépés előtt egy manuális ellenőrzésre van szükség.
Hibakezelés és Feltételes Futtatás: A Robusztus Szkript Titka [✅]
Egy „tökéletes szkript” nemcsak futtatja a programokat, hanem intelligensen reagál a futtatás eredményeire is. Mi történik, ha egy program hibával fejeződik be? Ezt ellenőrizhetjük az ERRORLEVEL
segítségével.
ERRORLEVEL
: A Visszatérési Kód
Minden program, amikor befejeződik, egy úgynevezett „kilépési kódot” vagy „visszatérési értéket” ad vissza. A 0
általában a sikeres befejezést jelenti, míg a nem nulla értékek hibát vagy figyelmeztetést jeleznek. A CMD-ben ezt az ERRORLEVEL
változó tárolja.
START /WAIT "" "C:Utvonalkritikus_program.exe"
IF %ERRORLEVEL% NEQ 0 (
echo [⚠️] Kritikus program hibával fejeződött be! Kilépési kód: %ERRORLEVEL%
GOTO HibaKezeles
) ELSE (
echo Kritikus program sikeresen lefutott.
)
:: Folytatás, ha sikeres
START /WAIT "" "C:Utvonalkovetkezo_program.exe"
GOTO End
:HibaKezeles
echo Egy hiba történt a feladat során. Kérjük, ellenőrizze a naplókat.
:: További hibakezelési lépések, pl. e-mail küldése
:End
echo A szkript befejeződött.
A IF %ERRORLEVEL% NEQ 0
azt jelenti: „ha az ERRORLEVEL
nem egyenlő 0-val” (azaz hiba történt). Ezzel a feltétellel irányíthatjuk a szkriptet egy hibakezelő részre (GOTO HibaKezeles
), vagy feltételesen indíthatunk el további programokat.
[ℹ️ Fontos:] Az ERRORLEVEL
mindig az utoljára végrehajtott program kilépési kódját tartalmazza. Ha több parancs van egy sorban, és csak az utolsót akarjuk ellenőrizni, figyelni kell a sorrendre.
Gyakorlati Tippek a Profi Szkriptekhez [💡]
- Naplózás (Logging): Mindig vezessünk naplót a szkriptek futásáról! A
>>
operátorral hozzáfűzhetjük a kimenetet egy fájlhoz, a2>&1
pedig biztosítja, hogy a hibaüzenetek is bekerüljenek a naplóba.START /WAIT "" "C:Utvonalprogram1.exe" argumentumok >> log.txt 2>&1 IF %ERRORLEVEL% NEQ 0 ( echo Hiba a program1 futtatásakor. Lásd log.txt >> log.txt GOTO HibaKezeles )
- Változók Használata: A változók (
SET
parancs) segítségével dinamikusabbá tehetjük a szkripteket. Például útvonalak, fájlnevek tárolására.SET LOG_FILE="C:Szkripteknaplo_%DATE%.log" echo Szkript indítása: %TIME% >> %LOG_FILE%
- Kommentek: A
REM
vagy::
prefixszel ellátott sorok kommentek. Használjuk őket bőven, hogy a szkript később is érthető legyen! - ECHO OFF: A szkript elejére írva az
@ECHO OFF
parancs elrejti a végrehajtott parancsok kiírását, így tisztább, olvashatóbb kimenetet kapunk a konzolon.
Példa a Tökéletes Szekvenciális Szkriptre: Egy Képfeldolgozó Folyamat [🚀]
Tegyük fel, hogy van egy mappánk tele képekkel. Szeretnénk azokat átméretezni egy külső programmal, majd egy másik programmal vízjelet tenni rájuk, végül egy harmadikkal archiválni őket. Ha hiba történik az átméretezés vagy a vízjelezés során, leállítjuk a folyamatot.
@ECHO OFF
SETLOCAL
SET LOG_PATH="C:SzkriptekKepfeldolgozas_log_%DATE%.txt"
SET RESIZE_APP="C:Program FilesImageResizerresizer.exe"
SET WATERMARK_APP="C:Program FilesWatermarkToolwatermarker.exe"
SET ARCHIVE_APP="C:Program Files7-Zip7z.exe"
SET SOURCE_FOLDER="C:KepekForras"
SET RESIZED_FOLDER="C:KepekAtmeretezett"
SET WATERMARKED_FOLDER="C:KepekVizjelezett"
SET ARCHIVE_FOLDER="C:KepekArchivum"
SET ARCHIVE_NAME="feldolgozott_kepek_%DATE:~0,4%%DATE:~5,2%%DATE:~8,2%.zip"
MD %RESIZED_FOLDER% 2>NUL
MD %WATERMARKED_FOLDER% 2>NUL
MD %ARCHIVE_FOLDER% 2>NUL
echo -------------------------------------------------------------------------------- >> %LOG_PATH%
echo Szkript indítása: %DATE% %TIME% >> %LOG_PATH%
echo -------------------------------------------------------------------------------- >> %LOG_PATH%
echo [1/3] Képek átméretezése... >> %LOG_PATH%
START /WAIT "" "%RESIZE_APP%" /input:"%SOURCE_FOLDER%" /output:"%RESIZED_FOLDER%" /width:800 /height:600 >> %LOG_PATH% 2>&1
IF %ERRORLEVEL% NEQ 0 (
echo [⚠️ HIBA] Átméretezés sikertelen. Kilépési kód: %ERRORLEVEL% >> %LOG_PATH%
GOTO HibaKezeles
)
echo Átméretezés sikeres. >> %LOG_PATH%
echo [2/3] Vízjelezés... >> %LOG_PATH%
START /WAIT "" "%WATERMARK_APP%" /input:"%RESIZED_FOLDER%" /output:"%WATERMARKED_FOLDER%" /text:"Sajat Ceg Kft." >> %LOG_PATH% 2>&1
IF %ERRORLEVEL% NEQ 0 (
echo [⚠️ HIBA] Vízjelezés sikertelen. Kilépési kód: %ERRORLEVEL% >> %LOG_PATH%
GOTO HibaKezeles
)
echo Vízjelezés sikeres. >> %LOG_PATH%
echo [3/3] Archíválás... >> %LOG_PATH%
"%ARCHIVE_APP%" a "%ARCHIVE_FOLDER%%ARCHIVE_NAME%" "%WATERMARKED_FOLDER%*" >> %LOG_PATH% 2>&1
IF %ERRORLEVEL% NEQ 0 (
echo [⚠️ HIBA] Archíválás sikertelen. Kilépési kód: %ERRORLEVEL% >> %LOG_PATH%
GOTO HibaKezeles
)
echo Archíválás sikeres. >> %LOG_PATH%
echo -------------------------------------------------------------------------------- >> %LOG_PATH%
echo Szkript sikeresen befejeződött: %DATE% %TIME% >> %LOG_PATH%
echo -------------------------------------------------------------------------------- >> %LOG_PATH%
GOTO End
:HibaKezeles
echo [Szkript HIBA] Kérjük, ellenőrizze a %LOG_PATH% fájlt!
echo -------------------------------------------------------------------------------- >> %LOG_PATH%
echo Szkript hibával fejeződött be: %DATE% %TIME% >> %LOG_PATH%
echo -------------------------------------------------------------------------------- >> %LOG_PATH%
ENDLOCAL
EXIT /B 1
:End
echo A feladat befejeződött. Részletek a %LOG_PATH% fájlban.
ENDLOCAL
EXIT /B 0
Az Én Véleményem: Amit a Valós Gyakorlat Tanít [🧠]
Évek óta foglalkozom különböző rendszerek automatizálásával, és a batch szkriptek gyakran kerültek a kezembe, amikor gyors, diszkrét megoldásra volt szükség. A fent leírt technikák alkalmazása nem csak megkönnyíti a munkát, hanem megelőzi a későbbi fejfájást is. Tapasztalatom szerint a legnagyobb kihívás nem is maga a parancsok megírása, hanem a szkript robusztussá tétele. Láttam már számos batch fájlt, ami egy ideig jól működött, majd egy váratlan hiba vagy környezeti változás miatt összeomlott. A leggyakoribb problémák közé tartozik:
„A megbízható automatizálás alapja nem az, hogy minden simán megy, hanem az, hogy a problémák esetén is intelligensen reagál, és világos nyomokat hagy maga után.”
- Elmaradt hibakezelés: Ha egy program hibával fejeződik be, és a szkript nem ellenőrzi az
ERRORLEVEL
-t, akkor a rossz adatokkal vagy állapottal folytatódik a munka, ami további, sokkal súlyosabb problémákhoz vezethet. Az alaposIF %ERRORLEVEL%
ellenőrzések beépítése nem „túlmunka”, hanem esszenciális. - Hiányzó naplózás: Amikor egy automatizált feladat éjszaka fut, és reggel látjuk, hogy nem működött, a napló az egyetlen barátunk. A részletes, timestampelt naplók (akár még a konzol kimenetet is belevezetve) felbecsülhetetlen értékűek a hibakeresés során.
- Abszolút útvonalak hiánya: Sok szkript csak az aktuális könyvtárban keresi a programokat. Ha a szkriptet máshonnan futtatják, vagy az útvonal változik, hibát jelez. Mindig használjunk abszolút útvonalakat (pl.
C:Programokalkalmazas.exe
) vagy környezeti változókat (pl.%PROGRAMFILES%
). - Nem kezelt szóközök: Ha egy fájl vagy mappa neve szóközt tartalmaz, idézőjelek közé kell tenni, különben a CMD külön paraméterként értelmezi. Ez a probléma hihetetlenül gyakori és bosszantó.
Az a „tökéletes szkript”, amiről a cím is szólt, valójában egy fejlődő entitás. Mindig van mit javítani rajta, finomítani, vagy új hibakezelési logikát hozzáadni. De az alapvető építőkövek – a START /WAIT
, a CALL
, az ERRORLEVEL
ellenőrzése és a naplózás – adják azt a szilárd alapot, amire egy megbízható automatizált rendszert építhetünk.
Zárszó [🔚]
Ne becsüljük alá a Windows parancssor (CMD) erejét. Bár nem rendelkezik a modern szkriptnyelvek (mint a PowerShell vagy Python) eleganciájával és gazdag funkciókészletével, a batch szkriptek elengedhetetlen eszközök maradnak a gyors, hatékony és függőségektől terhelt feladatok automatizálásához. A programok futtatásának, a várakozásnak és a szekvenciális indításnak a megértése és helyes alkalmazása kulcsfontosságú. A most megismert parancsok és elvek birtokában képesek leszünk olyan szkripteket írni, amelyek nemcsak elvégzik a dolgukat, hanem megbízhatóan és ellenőrizhetően teszik azt, minimális emberi beavatkozással. Kísérletezzünk, tanuljunk a hibáinkból, és építsünk egyre jobb automatizált megoldásokat!