batch parameters: everything after %1

WindowsParametersBatch FileArguments

Windows Problem Overview


Duplicate:

Clarification: I knew of the looping approach - this worked even before Command Extensions; I was hoping for something fun and undocumented like %~*1 or whatever - just like those documented at http://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/percent.mspx?mfr=true.


In a Windows batch file (with the so called "Command Extensions" on), %1 is the first argument, %2 is the second, etc. %* is all arguments concatenated.

My question: is there a way to get everything AFTER %2, for example?

I couldn't find such a thing, and it would be helpful for something I'm working on.

Windows Solutions


Solution 1 - Windows

There is a shorter solution (one-liner) utilizing the tokenization capabilities of for loops:

:: all_but_first.bat
echo all: %*
for /f "tokens=1,* delims= " %%a in ("%*") do set ALL_BUT_FIRST=%%b
echo all but first: %ALL_BUT_FIRST%

output:

> all_but_first.bat foo bar baz
all: foo bar baz
all but first: bar baz

Footnote: Yes, this solution has issues. Same as pretty much anything written with batch files. It's 2021. Use Powershell or literally any other actual scripting language.

Solution 2 - Windows

I am not sure if there is a direct command but you can always use a simple loop and shift to get the result in a variable. Something like:

@echo off
set RESTVAR=
shift
:loop1
if "%1"=="" goto after_loop
set RESTVAR=%RESTVAR% %1
shift
goto loop1

:after_loop echo %RESTVAR%

Let me know if it helps!

Solution 3 - Windows

The following will work for args with ", =, ' '. Based on Dmitry Sokolov answer. Fixed issue when second arg is the same as first arg.

@echo off
echo %*
set _tail=%*
call set _tail=%%_tail:*%1=%%
echo %_tail%

Solution 4 - Windows

The following will work for args with ", =, ' ' (as compared to @MaxTruxa answer)

echo %*
set _all=%*
call set _tail=%%_all:*%2=%%
set _tail=%2%_tail%
echo %_tail%

Test

> get_tail.cmd "first 1" --flag="other options" --verbose
"first 1" --flag="other options" --verbose
--flag="other options" --verbose

Solution 5 - Windows

You can use SHIFT for this. It removes %1 and shifts all other arguments one lower. This script outputs all the arguments after %2 (so it outputs %3, %4...) until one of them is empty (so it's the last one):

@echo off

SHIFT
SHIFT

:loop
if "%1" == "" goto end
echo %1
SHIFT
goto loop

:end

EDIT: Removed example using %* as this doesn't work - %* always outputs all of the parameters

Solution 6 - Windows

Building on schnaader's answer, I think this does it if you want everything after %1 concatenated.

@echo off

SHIFT

set after1=

:loop
if "%1" == "" goto end
set after1=%after1% %1
SHIFT
goto loop


:end

echo %after1%

Solution 7 - Windows

Sebi, here's the Syntax! There is a behavior, batch eating the equal signs which is not double quoted, it cause trouble in the scripts above. If you wan't to skip, i've made a modification, based on Raman Zhylich answer and strlen.cmd:

@ECHO OFF
SETLOCAL enableDelayedExpansion

SET _tail=%*
SET "_input="
SET /A _len=0

:again
SET "_param=%1"
SET "_input=%_input%%1"
FOR /L %%i in (0,1,8191) DO IF "!_param:~%%i,1!"=="" (
	REM skip param
	SET /A _len+=%%i
	REM _len can't be use in substring
	FOR /L %%j in (!_len!,1,!_len!) DO (
		REM skip param separator
		SET /A _len+=1
		IF "!_tail:~%%j,1!"=="=" (SET "_input=%_input%=" & SHIFT & goto :again)
	)
) & goto :next
:next
IF %_len% NEQ 0 SET _tail=!_tail:~%_len%!

ENDLOCAL & SET "_input=%_input%" & SET "_tail=%_tail%"

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionnoamtmView Question on Stackoverflow
Solution 1 - WindowsMax TruxaView Answer on Stackoverflow
Solution 2 - WindowsSamuelView Answer on Stackoverflow
Solution 3 - WindowsRaman ZhylichView Answer on Stackoverflow
Solution 4 - WindowsDmitry SokolovView Answer on Stackoverflow
Solution 5 - WindowsschnaaderView Answer on Stackoverflow
Solution 6 - WindowsScott LanghamView Answer on Stackoverflow
Solution 7 - WindowsBUZA LászlóView Answer on Stackoverflow