NT Syntax

CALL

Call one batch program from another.

syntax
      CALL [drive:][path]filename [parameters]

CALL :label [parameters] CALL internal_cmd key: parameters Any command-line arguments.
:label Jump to a label somewhere within the current batch file. internal_cmd Any internal NT command CALLing a command in this way (rather than simply running it) will evaluate any environment variable parameters note: CALL does support network (UNC) pathnames

Passing Parameters

When calling a secondary batch file or subroutine, you will often want the routine to manipulate some data, the data (usually a variable) should be passed as a parameter.

Jumping to a label

A label is defined by a single colon followed by a name

As this is effectively a subroutine I always prefix the name with s_

:s_error_message

When you jump to a subroutine with CALL, all statements after the label are treated like a separate batch file. When the end of the batch is reached, it will exit and control will return back to just after the position where you used CALL.

You can therefore reach the end of the batch script file more than once.

Don't forget you can also pass command line arguments to the :label and refer to these just like the parameters passed to a separate batch file.

For example

   @ECHO OFF
   SETLOCAL
   CALL :s_staff SMITH 100
   GOTO :eof

   :s_staff
   SETLOCAL
   ECHO Name is %1
   ECHO Rate is %2
   GOTO :eof

Notice that it is not necessary to place "quotes" around any of the values.

Returning Parameters

When a subroutine is complete you need a method of returning values, i.e. setting a variable that is visible to the calling routine.

This is done by executing the ENDLOCAL command on the same line as a SET statement(s)

For example

   @ECHO OFF
   SETLOCAL
   CALL :s_calc 200 100
   ECHO %v_return%
   GOTO :eof

   :s_calc
   SETLOCAL
   SET v_sum=0
   IF %1 GTR %2 SET v_sum=5 
   ENDLOCAL & SET v_return=%v_sum%
   GOTO :eof

Another example of this. This technique works in exactly the same way when calling a subroutine.

Advanced usage : CALLing internal commands

CALL can be used to run any internal command (SET, ECHO etc) and will evaluate any environment variables passed on the same line. Each CALL does a % substitution. (You can also do CALL CALL... for multiple substitutions)

For example

  @ECHO off
  SET v_name=simon
  SET v_myvar=v_name

  echo [%v_myvar%]
  CALL echo [%%%v_myvar%%%]

  :: note the line above is equivalent to
  :: ECHO [%[%v_myvar%]%]
  :: but when using CALL we have to double
  :: the outer %'s to prevent CALL from attempting 
  :: to evaluate this like a second environment variable

If Command Extensions are disabled, the CALL command will not accept batch labels.

"My mother never saw the irony in calling me a son-of-a-bitch." - Jack Nicholson

Related commands
:

CMD - can be used to call a subsequent batch and ALWAYS return even if errors occur.
GOTO - jump to a label or GOTO :eof
START - Start a separate window to run a specified program or command

Equivalent Linux BASH commands:

. (dot operator) - Include (run) commands from another file
builtin - Run a shell builtin
chroot - Run a command with a different root directory



Simon Sheppard
SS64.com