如何对 %%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 等变量使用延迟扩展?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用android延迟不扩展或实现Thread或Runnable

认识批处理延迟变量扩展

批处理文件中延迟扩展的示例

批处理脚本-延迟环境变量扩展

修改 for 循环以不在批处理脚本中使用延迟扩展

批处理中setlocal enabledelayedexpansion的作用详细整理