Page 1 of 1

How to undo SHIFT effect

Posted: 16 Jun 2010 07:28
by ernest211
How can I undo Shift effect of course if it possible. What do I mean, I’m executing my script passing two or more arguments and in this script I have shift so my first argument will be equals what I pass as second argument. Now when method with shift will end I wan to undo shift effect.

e.g.
I have script “test.bat” and I’m running him “test.bat param1 param2 param3”
script code

Code: Select all

@ECHO OFF
echo start: %1

:Loop
IF "%2"=="" GOTO Continue   
   echo %2   
SHIFT
GOTO Loop
:Continue

echo end: %1


So script must display on de beginning “param1” and also on the end but now he displaying "param1" and nothing on the end.
How can I do this?

Re: How to undo SHIFT effect

Posted: 16 Jun 2010 07:46
by amel27
ernest211 wrote:So script must display on de beginning “param1” and also on the end but now he displaying "param1" and nothing on the end.
How can I do this?
it's not undo shift, but with same result (preserve original params):

Code: Select all

@echo off
echo start: %1
call :loop %*

echo end: %1
goto :eof

:loop
if "%2"=="" goto :eof
echo %2
shift
goto loop

Re: How to undo SHIFT effect

Posted: 16 Jun 2010 09:59
by avery_larry
I would suggest you try and avoid using shift completely if you might need the parameters later in your script.

2 ideas for you:

1) Specific to the code you have shown, you could use a for loop:

Code: Select all

@ECHO OFF
echo start: %1
for %%a in (%*) do echo %%a
echo end: %1


2) You can use a for loop to go through all the parameters, and assign them all to variables. These variables would then be used in the rest of your code:

Code: Select all

@ECHO OFF
setlocal enabledelayedexpansion
set idx=0
for %%a in (%*) do (
   set /a idx+=1
   set param!idx!=%%a
)
echo There were %idx% parameters passed.
echo Start: %param1%
for /l %%a in (2,1,%idx%) do echo.!param%%a!
echo End:  %param1%


so param1 = %1, param2 = %2, param3 = %3 etc.

or the same using shift to assign variables and the "call" trick to avoid delayedexpansion:

Code: Select all

@echo off
set idx=0
echo Start: %1

:loop
set /a idx+=1
set param%idx%=%1
shift
if not "%1"=="" goto :loop
for /l %%a in (2,1,%idx%) do call echo.%%param%%a%%
echo End: %param1%