我希望使用一个在for循环中定义的变量,并使用它来调用预定义的变量。
例如:要启动程序"Slack"
,我需要调用变量%Slack%
。批处理文件将接受您的输入,因此如果我输入"Slack"
,变量!filename[%%i]!
将被分配"Slack"
。一旦完成,我希望使用%Slack%
调用!filename[%%i]!
。按照逻辑:%!filename[%%i]!%
使用%!filename[%%i]!%
将使批处理文件崩溃并关闭。
设置set file=!filename[%%i]!
并使用%file%
运行它将不会返回任何内容。
任何聪明的把戏?
@echo off
setlocal EnableDelayedExpansion
:: Predefined variables
for /f "delims== tokens=1,2" %%G in (D:\programs.txt) do set %%G=%%H
set /P "filenames=Enter programs to install: "
:: Puts input into array
set n=0
for %%a in (%filenames%) do (
set /A n+=1
set "filename[!n!]=%%~a"
)
:: Run variables imported from programs.txt
for /L %%i in (1,1,%n%) do (
:: This is where I want !filename[%%i]! to be called as %!filename[%%i]!%
)
pause
endlocal
program.txt示例
Slack=C:\Users\username\AppData\Local\slack\slack.exe
Text=C:\textfile.txt
Program=C:\program.bat & C:\program_license.txt
我不喜欢使用评论中描述的CALL黑客,因为1),它相对较慢,2)它导致额外的解析,可能需要额外的转义(这里不是问题)。更糟糕的是,它会腐败引用^
- "^"
变成"^^"
,并且没有逃脱序列可以阻止这种情况。
我的解决方案是添加一个额外的FOR循环,以便可以暂存扩展。
for /L %%i in (1,1,%n%) do for %%A in ("!filename[%%i]!") do echo !%%~A!
这肯定比CALL黑客更冗长,但它是一个很好的代码模式,因为它更普遍适用。