Поскольку значения% 1,% 2,% 3 ... и т.д. В пакете не могут быть изменены, мне нужно создать их копию.

Вопрос:

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 (...)"

3 ответа3

1

Я не могу найти действительно чистый способ запустить вторую программу (или пакетный файл, или что-то еще) с измененным списком аргументов, но я считаю, что у меня есть хорошие 88% того, что вы хотите:

@echo off
setlocal enabledelayedexpansion
set i=0
for %%A in (%*) do (
    set /a i+=1
    echo arg !i! is %%A
    set var!i!=%%A      // Это устанавливает var1=%1 , var2=%2 ,…
                        // и, конечно, вы можете изменить значения в этой точке.
)
                        // И на этом этапе %i% - это число аргументов.
 (Другие вещи)
          ︙
for /L %%J in (1, 1, %i%) do (
    call :kludge var%%J           // var%%J равен « var1 » или « var2 » или…
    echo arg %%J is !this_value!  // Это перебирает исходные аргументы,
                                  // и, конечно, вы можете изменить их и здесь.
)
 (Другие вещи)
          ︙
exit /b

:kludge
set this_value=!%1!
exit /b

0

Как кто-то упоминает на SO

% *, кажется, содержит все аргументы, переданные сценарию.

это было здесь

Обновление 1:

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

Вы можете сохранить их все в переменную, например

SET ARGS_LIST=%*
echo %ARGS_LIST%
0

Я не уверен, зачем вам это нужно, но вы можете сделать копию параметров, используя:

set parms=%*

Вышеупомянутое будет работать для большинства ситуаций, хотя есть некоторые случаи, когда это терпит неудачу. Например, произойдет сбой, если параметр содержит специальные символы без кавычек.

Параметры можно безопасно повторять с помощью цикла FOR тогда и только тогда, когда ни один из параметров не содержит * или ? и все параметры, содержащие пробел или специальные символы, заключаются в кавычки.

for %%P in (%parms%) do ...

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .