call
Komenda call
umożliwia wywołanie jednego pliku wsadowego (.bat
lub .cmd
) z poziomu innego pliku wsadowego bez przerywania wykonywania skryptu rodzica. Dzięki niej można także skakać do oznaczonych etykiet w tym samym pliku wsadowym i przekazywać im parametry. Poza użyciem w skryptach wsadowych call
nie ma żadnego efektu w interaktywnej sesji CMD – wywołanie go bezpośrednio w wierszu poleceń powoduje jedynie nową linię.
Komenda call
jest wbudowanym poleceniem CMD, pozwalającym na zagnieżdżanie i re-używanie skryptów wsadowych. Umożliwia uruchomienie drugiego pliku wsadowego albo przejście do etykiety (subroutyny) wewnątrz tego samego skryptu bez zakończenia działania skryptu wywołującego.
Składnia
Dział zatytułowany „Składnia”call [<ścieżka>\]<plik>.bat [parametry…]call :<etykieta> [argumenty…]call /?
[<ścieżka>\]<plik>.bat [parametry…]
– pełna lub względna ścieżka do pliku wsadowego; przekazywane parametry odpowiadają symbolom%1
,%2
itd.:<etykieta> [argumenty…]
– nazwa etykiety w bieżącym skrypcie; przekazane argumenty dostępne są jako%1
,%2
itd./?
– wyświetla pomoc dotyczącącall
.
Parametry
Dział zatytułowany „Parametry”Parametr | Opis |
---|---|
<plik>.bat [args] | Uruchamia zewnętrzny skrypt; rodzic czeka na zakończenie podprocesu. |
:<etykieta> [args] | Przechodzi do oznaczonej etykiety w tym samym pliku, przekazując argumenty do podprocedury. |
/? | Wyświetla pomoc inline dotyczącą call . |
Przykłady użycia
Dział zatytułowany „Przykłady użycia”-
Wywołanie innego skryptu
Okno terminala call Backup.bat C:\Dane\ C:\Kopia\Zawiesza skrypt do zakończenia
Backup.bat
, przekazując mu dwa parametry. -
Skok do etykiety w tym samym pliku
Okno terminala @echo offecho Startcall :ProcessFiles *.txtecho Koniecgoto :EOF:ProcessFilesecho Przetwarzam pliki: %1goto :EOFUruchamia podprocedurę
:ProcessFiles
z argumentem. -
Wyświetlenie pomocy
Okno terminala call /?Pokazuje syntaktyczną pomoc dotyczącą
call
w CMD.
call
jest poleceniem wewnętrznym CMD; wywołanie skryptu bezcall
zakończy wykonanie skryptu wywołującego.- Wywołując
call :etykieta
, zmienne%1
,%2
itd. odnoszą się do argumentów podprocedury. call
może spowolnić pętle; w takich przypadkach warto użyć delayed expansion (SetLocal EnableDelayedExpansion
).
Najczęściej spotykane błędy i ich rozwiązania
Dział zatytułowany „Najczęściej spotykane błędy i ich rozwiązania”Błąd | Przyczyna | Rozwiązanie |
---|---|---|
'call' is not recognized… | Uruchomiono w innym interpreterze (np. PowerShell) lub CMD nie w PATH. | Użyj CMD.exe i upewnij się, że %SystemRoot%\System32 jest w PATH. |
Cannot find the file specified. | Niepoprawna ścieżka lub nazwa pliku wsadowego. | Sprawdź istnienie pliku, popraw ścieżkę, użytkuj cudzysłowy przy spacji. |
Labels must begin with “:” | Wywołanie etykiety bez dwukropka (call ProcessFiles ). | Popraw na call :ProcessFiles i upewnij się, że definicja etykiety ma formę :ProcessFiles . |
Infinite recursion | Brak warunku zakończenia przy rekurencji etykiet. | Dodaj exit /b na końcu podprocedury lub warunek if przed wywołaniem, by zakończyć rekursję. |
Problemy z przekierowaniem | call z potokami lub redirection może nie działać poprawnie. | Unikaj potoków z call lub użyj alternatywy, np. call :Func > output.txt zamiast ` |
Porada: Zawsze używaj
call
do uruchamiania plików wsadowych, by skrypt rodzic zachował kontrolę przepływu.