Since the values %1, %2, %3...etc in a batch can't be modify, I need to create a copy of it.


Q1: How to create a copy in one go?  
    Not like SET cp1=%1, SET cp2=%2, ...etc.

Q2: Can one access the variables in this copy by a for loop, which is similar to
    "FOR %%A IN (%*) DO (...)"
  • 1
    In the for loop why can't you set a variable to %%A, then do what you want with it?
    – Karan
    Jan 23 '13 at 16:04
  • Because I need the modified value to pass them to another bat.
    – user565739
    Jan 23 '13 at 17:13
  • However, just create var1~var9, assign them to %1~%9, using FOR %%A IN (var1 var2....var9) DO works for me.
    – user565739
    Jan 23 '13 at 17:14
  • Ah, so you need to pass along multiple modified values to a second batch file, and thus cannot copy them one by one to the same variable in a loop and modify them?
    – Karan
    Jan 23 '13 at 17:17
  • 1
    Yes, I got it, you need multiple modified values together. A for loop with a single variable to which each value is copied in turn won't help in this case. So what's wrong with your solution? Edit: You know, you've asked 3 batch-related questions, and I think they're all part of the same problem. If so, why not simply create a single question stating clearly what it is you're actually trying to do, rather than ask piecemeal?
    – Karan
    Jan 23 '13 at 17:26

I can’t figure out a really clean way to run the second program (or batch file, or whatever) with the modified argument list, but I believe I have a good 88% of what you want:

@echo off
setlocal enabledelayedexpansion
set i=0
for %%A in (%*) do (
    set /a i+=1
    echo arg !i! is %%A
    set var!i!=%%A      // This sets var1=%1, var2=%2, …
                        // and, of course, you could modify the values at this point.
                        // And at this point, %i% is the number of arguments.
 (Other stuff)
for /L %%J in (1, 1, %i%) do (
    call :kludge var%%J           // var%%J is “var1” or “var2” or …
    echo arg %%J is !this_value!  // This iterates through the original args,
                                  // and, of course, you could modify them here, too.
 (Other stuff)
exit /b

set this_value=!%1!
exit /b

  • Thanks for the trick set var!i!=%%A , I will try it.
    – user565739
    Jan 25 '13 at 8:48
  • 100% what I want. Make a copy of all argument in one go!
    – user565739
    Jan 25 '13 at 8:59

As someone mention on SO

%* seems to hold all of the arguments passed to the script.

it was here

Update 1:

@echo %1
if not "%~1"=="" goto loop

You can save them all to variable e.g

echo %ARGS_LIST%
  • But I can't not modify these values, so I create a copy. This is what I asked here.
    – user565739
    Jan 23 '13 at 15:00
  • u can loop through all arguments by the upper code (update 1) Jan 23 '13 at 15:07

I'm not sure why you need to do this, but you can make a copy of the parameters using:

set parms=%*

The above will work for most situations, though there are some cases where it will fail. For example, it will fail if a parameter includes unquoted special characters.

The parameters can safely be iterated using a FOR loop if and only if none of the parameters contain * or ?, and all parameters containing space or special characters are quoted.

for %%P in (%parms%) do ...
  • The problem is that I can't still modify the value of %%P, because %%P will be %1, %2, ...etc
    – user565739
    Jan 25 '13 at 8:46

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.