Przejdź do głównej zawartości

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.


Okno terminala
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.

ParametrOpis
<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.

  1. 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.

  2. Skok do etykiety w tym samym pliku

    Okno terminala
    @echo off
    echo Start
    call :ProcessFiles *.txt
    echo Koniec
    goto :EOF
    :ProcessFiles
    echo Przetwarzam pliki: %1
    goto :EOF

    Uruchamia podprocedurę :ProcessFiles z argumentem.

  3. Wyświetlenie pomocy

    Okno terminala
    call /?

    Pokazuje syntaktyczną pomoc dotyczącą call w CMD.


  • call jest poleceniem wewnętrznym CMD; wywołanie skryptu bez call 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).

BłądPrzyczynaRozwią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 recursionBrak 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 przekierowaniemcall 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.