我正在寻找使用一个在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
答案 0 :(得分:3)
我不喜欢使用注释中描述的CALL hack,因为1)它相对较慢,并且2)它导致了额外的一轮解析,可能需要额外的转义(这里不是问题)。更糟糕的是,它会破坏引用的^
-"^"
变成"^^"
,并且没有任何转义序列可以防止这种情况。
我的解决方案是添加一个额外的FOR循环,以便可以进行扩展。
for /L %%i in (1,1,%n%) do for %%A in ("!filename[%%i]!") do echo !%%~A!
这肯定比CALL hack更为冗长,但是它是一个很好的学习代码模式,因为它更通用。