如何对 %%a 或 %1 等变量使用延迟扩展?
Posted
技术标签:
【中文标题】如何对 %%a 或 %1 等变量使用延迟扩展?【英文标题】:How to use delayed expansion on a variable like %%a or %1? 【发布时间】:2021-11-17 15:39:03 【问题描述】:我正在尝试创建一个从另一个批处理文件调用的批处理文件,但变量不起作用,所有结果都是“a”,而预期结果将是 option1=a、option2=b 等.
这是演示问题的代码:
call temp.bat a b c d e f g h i j k l m n o p q r s t e u v w x y z
pause
exit
对于 temp.bat:
set Number=0
for %%a in (%*) do set /a Number+=1
for /l %%a in (1,1,%Number%) do (
set option%%a=%1
shift
)
exit /b
我试过!%1!
,结果为空; %%1%
给出了 "%1" 作为结果; %1%
的结果与仅使用 %1
的结果相同
【问题讨论】:
Argument references 和for
meta-variables 与environment variables 完全不同,而delayed expansion 只影响后者……
【参考方案1】:
您可以使用一个FOR
命令来执行此操作,这样效率会更高。
使用调用方法
@echo off
set Number=0
for %%a in (%*) do (
set /a Number+=1
call set "option%%Number%%=%%a"
)
使用延迟扩展
@echo off
setlocal enabledelayedexpansion
set Number=0
for %%a in (%*) do (
set /a Number+=1
set "option!Number!=%%a"
)
【讨论】:
两者都有效,但在我的具体情况下,这个效果更好(更有效)【参考方案2】:您可以使用call
强制执行另一个级别的间接。它会在评估之前将%%1
扩展为%1
for /l %%a in (1,1,%Number%) do (
call set option%%a=%%1
shift
)
Batch number variable setter
BAT-file: variable contents as part of another variable
How can I pass a variable name as part of a parameter to a batch file and then use it?
另请参阅此处:Batch-Script - Iterate through arguments
【讨论】:
以上是关于如何对 %%a 或 %1 等变量使用延迟扩展?的主要内容,如果未能解决你的问题,请参考以下文章