由于批次中的值 %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 (...)"
答案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
答案2
正如有人在SO上提到的那样
%* 似乎保存了传递给脚本的所有参数。
它是这里
更新 1:
:loop
@echo %1
shift
if not "%~1"=="" goto loop
您可以将它们全部保存到变量中,例如
SET ARGS_LIST=%*
echo %ARGS_LIST%
答案3
我不确定为什么你需要这样做,但你可以使用以下命令复制参数:
set parms=%*
上述方法在大多数情况下都有效,但在某些情况下会失败。例如,如果参数包含未加引号的特殊字符,该方法就会失败。
*
当且仅当所有参数都不包含或?
,并且所有包含空格或特殊字符的参数都用引号引起来时,才可以使用 FOR 循环安全地迭代参数。
for %%P in (%parms%) do ...