8

I need to get last argument passed to windows batch script, how can I do that?

1
  • See here Commented Apr 27, 2011 at 14:00

4 Answers 4

12

This will get the count of arguments:

set count=0
for %%a in (%*) do set /a count+=1

To get the actual last argument, you can do

for %%a in (%*) do set last=%%a

Note that this will fail if the command line has unbalanced quotes - the command line is re-parsed by for rather than directly using the parsing used for %1 etc.

Sign up to request clarification or add additional context in comments.

1 Comment

Why did you answer with the argument count? That wasn't what was asked.
10

The easiest and perhaps most reliable way would be to just use cmd's own parsing for arguments and shift then until no more are there.

Since this destroys the use of %1, etc. you can do it in a subroutine:

@echo off
call :lastarg %*
echo Last argument: %LAST_ARG%
goto :eof

:lastarg
  set "LAST_ARG=%~1"
  shift
  if not "%~1"=="" goto lastarg
goto :eof

Comments

1

An enhanced version of joey's answer:

@ECHO OFF
SETLOCAL

:test
    :: https://stackoverflow.com/a/5807218/7485823
    CALL :lastarg xxx %*
    ECHO Last argument: [%XXX%]
    CALL :skiplastarg yyy %*
    ECHO skip Last argument: [%yyy%]
GOTO :EOF

:: Return all but last arg in variable given in %1
:skiplastarg returnvar args ...
    SETLOCAL
        SET $return=%1
        SET SKIP_LAST_ARG=
        SHIFT
    :skiplastarg_2
        IF NOT "%~2"=="" SET "SKIP_LAST_ARG=%SKIP_LAST_ARG% %1"
        SHIFT
        IF NOT "%~1"=="" GOTO skiplastarg_2
    ENDLOCAL&CALL SET "%$return%=%SKIP_LAST_ARG:~1%"
GOTO :EOF

:: Return last arg in variable given in %1
:lastarg returnvar args ...
    SETLOCAL
      SET $return=%1
      SET LAST_ARG=
  SHIFT
    :LASTARG_2
      SET "LAST_ARG=%1"
      SHIFT
      IF NOT "%~1"=="" GOTO lastarg_2
    ENDLOCAL&call SET %$return%=%LAST_ARG%
GOTO :EOF

Run it with the arguments:

abe "ba na na" "cir cle"

and get:

Last argument: ["cir cle"]

skip Last argument: [abe "ba na na"]

1 Comment

Thank you, sometimes it helps to process just the last couple of arguments differently but pass on the rest as is
0
set first=""
set last=""
for %%a in (%*) do (
SETLOCAL ENABLEDELAYEDEXPANSION
if !first!=="" (set first=!last!) else (set first=!first! !last!)
set last=%%a

)
ENDLOCAL & set "last=%last%" & set "first=%first%"
echo %last%  "and" %first%

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.